LDR的用法 ARM指令及偽指令

2021-07-31 20:03:51 字數 3027 閱讀 3945

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...