質問
私は現在、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 を使用していると思います。