ARM彙編中ldr與adr的區別

2021-05-01 01:35:42 字數 1367 閱讀 7277

ldr與adr的區別

nop編譯的時候設定 ro 為 0x0c008000

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

0c008000 <_start-0x14>:

c008000:       e59f000c        ldr     r0, [pc, #12]   ; c008014 <_start>

c008004:       e28f0008        add     r0, pc, #8      ; 0x8

c008008:       e59f0008        ldr     r0, [pc, #8]    ; c008018 <_start+0x4>

c00800c:       e1a00000        nop                     (mov r0,r0)

c008010:       e1a0f00e        mov     pc, lr

0c008014 <_start>:

c008014:       e1a00000        nop                     (mov r0,r0)

c008018:       0c008014        stceq   0, cr8, [r0], -#80

分析:ldr     r0, _start

從記憶體位址 _start 的地方把值讀入。執行這個後,r0 = 0xe1a00000

adr     r0, _start

取得 _start 的位址到 r0,但是請看反編譯的結果,它是與位置無關的。其實取得的時相對的位置。例如這段**在 0x0c008000 執行,那麼 adr r0, _start 得到 r0 = 0x0c008014;如果在位址 0 執行,就是 0x00000014 了。

ldr     r0, =_start

這個取得標號 _start 的絕對位址。這個絕對位址是在 link 的時候確定的。看上去這只是乙個指令,但是它要占用 2 個 32bit 的空間,一條是指令,另一條是 _start 的資料(因為在編譯的時候不能確定 _start 的值,而且也不能用 mov 指令來給 r0 賦乙個 32bit 的常量,所以需要多出乙個空間存放 _start 的真正資料,在這裡就是 0x0c008014)。

因此可以看出,這個是絕對的定址,不管這段**在什麼地方執行,它的結果都是 r0 = 0x0c008014

arm彙編adrl(以及ldr與adr的區別)

看 嵌入式linux應用開發 第六章例項中看到個句 adrl r2,men cfg val 最初對adr1相當不解,後來發現,那個不是數字1,而是字母l 認真看頭部,有點區別的 這裡記錄下adrl的用法 功能 將相對於程式或相對於暫存器的位址載入暫存器中。與adr指令相似。adrl生成兩個資料處理指...

ARM彙編中ldr與adr的區別

ldr與adr的區別 ldr r0,start adr r0,start ldr r0,start nopmov pc,lr start nop編譯的時候設定 ro 為 0x0c008000 0c008000 start 0x14 c008000 e59f000c ldr r0,pc,12 c008...

彙編指令 adr與ldr偽彙編區別

adr 相對定址,與當前位置有關 ldr 絕對定址,與當前位置無關 在初始化sdram時就會用到adr,如下 初始化sdram ldr r0,bwscon r0 sdram暫存器基位址,獲取絕對位址 adr r1,sdram config 使用adr相對跳轉,r1 sdram config位址 ad...