2012-07-05 20 views
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 

回答

4

在ARM模式下(vs 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 
+0

但存储多个不支持CPSR,SPSR也不支持PC相对寻址,我需要使用既然不能划伤任何寄存器,或以其他方式我可以存储一个寄存器,然后使用,作为一个指针与回写STMIA递增的指针和重新使用该指针写CPSR和SPSR .. 此外,我怎么使用符号,以汇编改变那些相对偏移? – sgupta 2012-07-05 23:22:58

+0

所有优点。您仍然需要在普通商店中储存一些注册商标。看到我上面的更新。 – 2012-07-05 23:30:37

+1

难道你不认为你需要第一STMIA之前添加4到R0? :P – sgupta 2012-07-05 23:54:49