ARM匯編中LDR和ADR的區(qū)別
ldr r0, _start
本文引用地址:http://m.butianyuan.cn/article/201611/318795.htmadr r0, _start
ldr r0, =_start
nop
mov pc, lr
_start:
nop
編譯的時候設(shè)置 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
從內(nèi)存地址 _start 的地方把值讀入。執(zhí)行這個后,r0 = 0xe1a00000
adr r0, _start
取得 _start 的地址到 r0,但是請看反編譯的結(jié)果,它是與位置無關(guān)的。其實取得的時相對的位置。例如這段代碼在 0x0c008000 運行,那么 adr r0, _start 得到 r0 = 0x0c008014;如果在地址 0 運行,就是 0x00000014 了。
ldr r0, =_start
這個取得標(biāo)號 _start 的絕對地址。這個絕對地址是在 link 的時候確定的??瓷先ミ@只是一個指令,但是它要占用 2 個 32bit 的空間,一條是指令,另一條是 _start 的數(shù)據(jù)(因為在編譯的時候不能確定 _start 的值,而且也不能用 mov 指令來給 r0 賦一個 32bit 的常量,所以需要多出一個空間存放 _start 的真正數(shù)據(jù),在這里就是 0x0c008014)。
因此可以看出,這個是絕對的尋址,不管這段代碼在什么地方運行,它的結(jié)果都是 r0 = 0x0c008014
評論