2
我开发一个程序,将引导其他程序,因此作为一个结果,我需要保持寄存器传递给我的程序,这样我可以跳跃到应有加载程序之前将其还原。这是一个裸机系统,没有操作系统,没有MMU(现在,但目前没有使用)。存储所有寄存器不会伤及任何
这里是我的代码,我只是想知道这是否是正确与否,因为我没有胳膊板来测试,我必须尽快提交此,
也是真的,相对于PC商店可以使用唯一来源寄存器的低位寄存器(R0-R7),我认为这是不能够访问在某些指令高寄存器仅拇指问题由于有限的指令宽度。
reset: @ entry point, mapped in reset vector
/* Store registers for bootstrapping */
STR R0, [PC, #128]
STR R1, [PC, #128]
STR R2, [PC, #128]
STR R3, [PC, #128]
STR R4, [PC, #128]
STR R5, [PC, #128]
STR R6, [PC, #128]
STR R7, [PC, #128]
/* Following registers can't be used in pc relative load/store */
MOV R0, R8
STR R0, [PC, #128]
MOV R0, R9
STR R0, [PC, #128]
MOV R0, R10
STR R0, [PC, #128]
MOV R0, R11
STR R0, [PC, #128]
MOV R0, R12
STR R0, [PC, #128]
MOV R0, SP
STR R0, [PC, #128]
MOV R0, LR
STR R0, [PC, #128]
MRS R0, CPSR
STR R0, [PC, #128]
MRS R0, SPSR
STR R0, [PC, #128]
ISB SY
B clear_regs
saved_regs:
.rept 32
.word 0x00000000
.endr
.align
clear_regs:
MOV R0, #0
MOV R1, #0
MOV R2, #0
MOV R3, #0
MOV R4, #0
MOV R5, #0
MOV R6, #0
MOV R7, #0
MOV R8, #0
MOV R9, #0
MOV R10, #0
MOV R11, #0
MOV R12, #0
MOV SP, #0
MOV LR, #0
但存储多个不支持CPSR,SPSR也不支持PC相对寻址,我需要使用既然不能划伤任何寄存器,或以其他方式我可以存储一个寄存器,然后使用,作为一个指针与回写STMIA递增的指针和重新使用该指针写CPSR和SPSR .. 此外,我怎么使用符号,以汇编改变那些相对偏移? – sgupta 2012-07-05 23:22:58
所有优点。您仍然需要在普通商店中储存一些注册商标。看到我上面的更新。 – 2012-07-05 23:30:37
难道你不认为你需要第一STMIA之前添加4到R0? :P – sgupta 2012-07-05 23:54:49