可能是一個常見的初學者問題,并且在此站點上已提出類似問題,但我在幾點上找不到任何幫助。如果你有一個用 定義的 32 位符號.word,并且你想將它加載到 registerr1中,那么傳統的方法是什么?
.syntax unified
.cpu cortex-m4
.thumb
/* ... */
_allones: .word 0xffffffff
test:
/* This seems to not work as expected */
ldr r1,_allones @ Value is corrupted/misaligned?
/* Two-line solution */
ldr r1,=_allones @ Loads the address of _allones into r1, not the value itself
ldr r1,[r1] @ Get value proper
我的困惑是,當您看到像這樣的教程時,只有應該管用。目標是 Cortex-M4,Thumb 模式,統一語法。ldr r1,=_allones_allones
FWIW 該ldr r1,_allones行改為將_allones其地址的最后兩個位元組和前兩個位元組加載到記憶體中,或者是徒勞的,我沒有仔細查看該值。
uj5u.com熱心網友回復:
通常,ldr r1, =sym會將符號的值加載sym到r1. (它通過將 的值組裝sym到記憶體中的一個稱為文字池的位置,該位置非常靠近指令,因此可以使用加載指令的相對于 pc 的文字形式來訪問它。)
但是有兩種不同的方式來定義一個符號。它可以定義為一個標簽,比如sym:,在這種情況下,符號的值就是它所標注的地址(直到構建的鏈接階段才可能真正知道)。你的代碼就是這種情況。但是符號也可以定義為數字常數,例如sym EQU 12345,在這種情況下,它的值就是數字 12345。這就是教程中發生的事情。
因此,如果您想加載0xffffffff到r1中,兩種可能性如下所示:
allones:
.word 0xffffffff
...
ldr r1, =allones @ now r1 contains the address where 0xffffffff is stored
ldr r1, [r1] @ load from that address
或者
allones EQU 0xffffffff
...
ldr r1, =allones
當然,如果值實際上是0xffffffff,那么最好只寫mov r1, 0xffffffff, 或allones equ 0xffffffff ; mov r1, allones。(#在某些匯編程式中是可選的。)mov立即數指令具有一組有限的值,可用作立即數,但0xffffffff它是其中之一。一些匯編程式可能會優化ldr r1, =const到mov r1, const常量何時具有適當的值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/477891.html
