ldr指令可以從記憶體中讀取資料到暫存器中。
ldr r1, [r2, #4] /*將位址為r2+4的記憶體單元資料讀取到r1中*/
ldr r1, [r2], #4 /*將位址為r2的記憶體單元資料讀取到r1中,然後r2 = r2 + 4*/
ldr偽指令不是真實存在的指令,編譯器會把它擴充套件成真正的指令:如果該常數能用「立即數」表示,則使用mov指令;否則編譯時將該常數儲存在某個位置,使用記憶體讀取指令把它讀出來。
ldr r1, =label
label:
...
獲取label的絕對位址,然後賦給r1。我們看下面兩個例子
ldr r0,=0x56000010
movr1,#0x00004000
str r1,[r0]
以上三條彙編語句的功能是將數值0x00004000儲存到以0x56000010為位址的儲存單元中。
其反彙編**如下
0: e59f0044 ldr r0, [pc, #68] ; 0x4c
4: e3a01901 mov r1, #16384 ; 0x4000
8: e5801000 str r1, [r0]
......
4c: 56000010 undefined
可見ldr r0,=0x56000010 被轉換成ldr指令來執行
ldr r0,=0x56000000
movr1,#0x00004000
str r1,[r0]
其反彙編**如下
0: e3a00456 mov
r0, #1442840576 ; 0x56000000
4: e3a01901 mov
r1, #16384 ; 0x4000
8: e5801000 str r1, [r0]
這裡ldr r0,=0x56000000 被轉換成mov r0, #1442840576
通過這兩個例子,我們可知 ldr偽指令是根據位址值來決定轉換為ldr指令或mov指令執行。
_text_base:
.word text_base
.globl lowlevel_init
lowlevel_init:
/* memory control configuration */
/* make r0 relative the current location so that it */
/* reads smrdata out of flash rather than memory ! */
ldr r0, =smrdata /*獲取smrdata的絕對位址,即鏈結位址, 0x33f8***x */
ldr r1, _text_base /*讀取_text_base處的內容,即text_base:0x33f80000*/
subr0, r0, r1
/*獲取smrdata的執行位址,即相對於當前pc的位址*/
ldr r1, =bwscon /* bus width status controller */
addr2, r0, #13*4
0: /*使用資料池中的數值,對各個暫存器進行賦值。*/
ldr r3, [r0], #4
str r3, [r1], #4
cmp r2, r0
bne 0b
/* everything is fine now */
mov pc, lr
.ltorg
/* the literal pools origin */
smrdata:
.word (0+(b1_bwscon<<4)+(b2_bwscon<<8)+(b3_bwscon<<12)+(b4_bwscon<<16)+(b5_bwscon<<20)+(b6_bwscon<<24)+(b7_bwscon<<28))
.word ((b0_tacs<<13)+(b0_tcos<<11)+(b0_tacc<<8)+(b0_tcoh<<6)+(b0_tah<<4)+(b0_tacp<<2)+(b0_pmc))
.word ((b1_tacs<<13)+(b1_tcos<<11)+(b1_tacc<<8)+(b1_tcoh<<6)+(b1_tah<<4)+(b1_tacp<<2)+(b1_pmc))
.word ((b2_tacs<<13)+(b2_tcos<<11)+(b2_tacc<<8)+(b2_tcoh<<6)+(b2_tah<<4)+(b2_tacp<<2)+(b2_pmc))
.word ((b3_tacs<<13)+(b3_tcos<<11)+(b3_tacc<<8)+(b3_tcoh<<6)+(b3_tah<<4)+(b3_tacp<<2)+(b3_pmc))
.word ((b4_tacs<<13)+(b4_tcos<<11)+(b4_tacc<<8)+(b4_tcoh<<6)+(b4_tah<<4)+(b4_tacp<<2)+(b4_pmc))
.word ((b5_tacs<<13)+(b5_tcos<<11)+(b5_tacc<<8)+(b5_tcoh<<6)+(b5_tah<<4)+(b5_tacp<<2)+(b5_pmc))
.word ((b6_mt<<15)+(b6_trcd<<2)+(b6_scan))
.word ((b7_mt<<15)+(b7_trcd<<2)+(b7_scan))
.word ((refen<<23)+(trefmd<<22)+(trp<<20)+(trc<<18)+(tchr<<16)+refcnt)
.word
0x32
.word
0x30
.word
0x30
ARM彙編中LDR偽指令和LDR指令
arm是risc結構,資料從記憶體到cpu之間的移動只能通過l s指令來完成,也就是ldr str指令。比如想把資料從記憶體中某處讀取到暫存器中,只能使用ldr比如 ldr r0,0x12345678 就是把0x12345678這個位址中的值存放到r0中。而mov不能實現這個功能,mov只能在暫存器...
ARM彙編中LDR偽指令和LDR指令
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!arm是risc結構,資料從記憶體到cpu之間的移動只能通過l s指令來完成,也就是ldr str指令。比如想把資料從記憶體中某處讀取到暫存器中,只能使用ldr比如 ldr r0,0x12345678就是把0x12345678這個位址中的值存放到r...
LDR指令和LDR偽指令
arm指令集中,ldr通常都是作載入指令,但是它也可以作偽指令。初學者一般不會注意到它們的區別,其實在嵌入式開發過程中,這兩條指令時非常常用的!我們應該了解他們的區別。ldr偽指令的形式是 ldr rn,expr 作用是裝在乙個32bit常數和乙個位址到暫存器。下面舉乙個例子來說明它的用法。coun...