我正在开发一个程序,它将引导另一个程序,因此我需要保留传递给我的程序的寄存器,以便我可以在跳转到应该加载的程序之前恢复它们。它是一个裸机系统,没有操作系统,没有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
答案 0 :(得分:4)
在ARM模式下(与Thumb模式相比),可以在PC相对存储中使用高位寄存器。如果不允许这样的事情,你的汇编程序会警告你。您可能还需要考虑使用STM(存储多个)指令,该指令允许您指定寄存器列表而不是单独执行它们。
您应该让汇编程序通过使用符号而不是手动指定偏移来执行计算PC偏移的“硬”工作。
reset: @ entry point, mapped in reset vector
/* Store registers for bootstrapping */
STR R0, saved_regs
ADR R0, saved_regs + 4
STMIA r0!, {r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15}
MRS R1, CPSR
MRS R2, SPSR
STMIA R0, {r1, r2}
ISB SY
B clear_regs
saved_regs:
.rept 32
.word 0x00000000
.endr