2

別のプログラムをブートストラップするプログラムを開発しているため、プログラムに渡されるレジスタを保存して、ロードされているはずのプログラムにジャンプする前にそれらを復元できるようにする必要があります。これはベア メタル システムであり、OS も 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

1 に答える 1

4

ARM モード (対 Thumb モード) では、PC 相対ストアの上位レジスタを使用しても問題ありません。そのようなものが許可されていない場合、アセンブラは警告します。レジスタを個別に指定するのではなく、リストを指定できる STM (Store Multiple) 命令の使用を検討することもできます。

手動でオフセットを指定する代わりに、シンボルを使用して 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
于 2012-07-05T23:11:08.177 に答える