Assembly 存储所有寄存器而不划伤任何

Assembly 存储所有寄存器而不划伤任何,assembly,arm,css-position,fpic,Assembly,Arm,Css Position,Fpic,我正在开发一个将引导另一个程序的程序,因此我需要保留传递给我的程序的寄存器,以便在跳转到应该加载的程序之前恢复它们。这是一个裸机系统,没有操作系统,没有MMU(存在,但目前还没有看到) 这是我的代码,我只想知道它是否正确,因为我没有arm板可供测试,我必须尽快提交 同样,pc相对存储只能使用源寄存器低寄存器(r0-r7),我认为这只是由于指令宽度有限而无法访问某些指令中的高寄存器的拇指问题 reset: @ entry point, mapped in reset vector /* Stor

我正在开发一个将引导另一个程序的程序,因此我需要保留传递给我的程序的寄存器,以便在跳转到应该加载的程序之前恢复它们。这是一个裸机系统,没有操作系统,没有MMU(存在,但目前还没有看到)

这是我的代码,我只想知道它是否正确,因为我没有arm板可供测试,我必须尽快提交

同样,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
在ARM模式下(相对于Thumb模式),在PC相对存储中使用高位寄存器是可以的。如果这样的事情是不允许的,你的汇编程序会警告你。您可能还需要考虑使用STM(SturnMulk)指令,它允许您指定寄存器列表而不是单独执行。 您可能应该让汇编器通过使用符号而不是手工指定偏移量来完成计算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
在ARM模式下(相对于Thumb模式),在PC相对存储中使用高位寄存器是可以的。如果这样的事情是不允许的,你的汇编程序会警告你。您可能还需要考虑使用STM(SturnMulk)指令,它允许您指定寄存器列表而不是单独执行。 您可能应该让汇编器通过使用符号而不是手工指定偏移量来完成计算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

但是store multiple不支持cpsr,spsr也不支持我需要使用的pc相对寻址,因为我不能擦除任何寄存器,否则我可以存储一个寄存器,然后使用它作为stmia的指针,使用回写递增指针,并重新使用该指针写入cpsr和spsr。。另外,我如何使用符号使汇编器将其更改为相对偏移量?所有这些都很好。您仍然需要使用普通存储来存储一些reg。请参阅上面的更新。您不认为需要在第一次STMIA之前将4添加到r0吗Pbut store multiple不支持cpsr,spsr也不支持我需要使用的pc相对寻址,因为我不能擦除任何寄存器,否则我可以存储一个寄存器,然后将其用作stmia的指针,并使用回写递增指针,然后重新使用该指针写入cpsr和spsr。。另外,我如何使用符号使汇编器将其更改为相对偏移量?所有这些都很好。您仍然需要使用普通存储来存储一些reg。请参阅上面的更新。您不认为需要在第一次STMIA之前将4添加到r0吗P