[英]Writing data to absolute address
我目前正在 Cortex-M3 微控制器上使用匯編器。 我不確定這是否重要,但是你去吧。
我需要將一個值寫入內存中的某個地址。 這是我嘗試過的:
LDR R4, =__cs3_interrupt_vector_cortex_m
STR R4, [=VTOR]
但似乎我需要引用相對於 PC 寄存器的 VTOR 地址。 問題是是否有辦法不引用地址相對並讓它自動執行(這樣它基本上看起來像我的方法)。
我正在使用 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 是一種加載存儲架構。 您不能在加載和存儲指令中使用內存操作數。 這簡化了 CPU 設計,但與 M68K 和 x86 匯編器不同。
語法ldr rX, =val
在Gnu 匯編程序信息頁中進行了解釋。 一般會轉換成下面這樣,
ldr rX, [pc, #offset]
...
offset: .word val ; your constant is stored here.
偽操作.ltorg
告訴匯編器轉儲文字表; 上面代碼的偏移部分。 您可以在子例程等之間的任何位置添加.ltorg
。
您不能使用語法str r4,[=VTOR]
因為equals語法只是與ldr
一起使用的捷徑。 例如,
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 rX,=VTOR
語法來獲取寄存器的地址。 然后它需要像str rY, [rX]
這樣的另一條指令來實際寫入該地址。
常量在指令中編碼,因此常量范圍非常有限,尤其是在拇指模式下。 我猜你正在使用可能有更大范圍的拇指2 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.