2012-07-05 65 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