簡體   English   中英

寫數據到絕對地址

[英]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, =valGnu 匯編程序信息頁中進行了解釋。 一般會轉換成下面這樣,

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM