質問

私は現在、Cortex-M3マイクロコントローラのアセンブラを持って少し遊んでいます。これが重要かどうかはわかりませんが、ここであなたは行きます。

メモリ内の特定のアドレスに値を書き込む必要があります。これが私が試したものです:

LDR     R4, =__cs3_interrupt_vector_cortex_m
STR     R4, [=VTOR]
.

しかし、私はPCレジスタを基準にしてVTORアドレスを参照する必要があるようです。問題は、アドレスのrelativを参照しない方法があるかどうかです(基本的に私のアプローチのように見えるように)。

私はGNUアセンブラを使っています。

役に立ちましたか?

解決

宛先アドレスをレジスタにロードする必要があります。 VTORがメモリアドレスであると仮定し、 'C'ポインタと__cs3_interrupt_vector_cortex_mは定数です。つまり、アドレスに32ビット定数を書き込みます。この場合、

 ; Get value __cs3_interrupt_vector_cortex_m to r4
 ldr r4, =__cs3_interrupt_vector_cortex_m 
 ldr r5, =VTOR ; address 'VTOR' to r5.
 str r4, [r5]  ; write the constant to 'VTOR' address.
.

ARM / Thumb / Thumb2は、 Load-Store アーキテクチャです。ロード命令とストア命令でメモリオペランドを使用することはできません。これによりCPU設計が簡単になりますが、M68KとX86アセンブラとは異なります。

構文ldr rX, =valは、 GNU Assembler Infoページで説明されています。一般的にそれは次のように変換されます、

ldr   rX, [pc, #offset]
...
offset: .word val ; your constant is stored here.
.

疑似op .ltorg は、リテラルテーブルをダンプするようにアセンブラに指示します。上記のコードのオフセット。サブルーチンの間に任意の場所に.ltorgを追加できます。

equals 構文としては、Syntax str r4,[=VTOR]を使用することはできません。たとえば、

です
ldr   rX,=7          ; is really 'mov rx,#7' in all modes.
ldr   rX,=0xff       ; is 'mov rx,#0xff' for ARM and '[pc,#offset]' for thumb.
ldr   rx,=0x12345678 ; will use the [pc, #offset] for all modes.
.

ldr構文を使用してアドレスをレジスタに取得できます。その後、ldr rX,=VTORのような別の命令が実際にそのアドレスに書き込まれます。

定数は命令内で符号化されているので、一定の範囲は特に親指モードで非常に制限されています。私はあなたがより多くの範囲を持つかもしれない thumb2 を使用していると思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top