<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Arm匯編 位置無(wú)關(guān)代碼 adr 指令

Arm匯編 位置無(wú)關(guān)代碼 adr 指令

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò ) 收藏
adr r0, _start 得到的是_start的當前執行位置,由 pc+offset 決定的 得到有效地址
ldr r0, =_start 得到的是絕對的地址,鏈接時(shí)決定;
------------------------------------------------------------------------
/* 重定位Boot代碼到RAM內存,將Boot代碼從FLASH移到RAM中 */
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
/**************************************************************************
* 把_start的相對地址移到r0, 相對尋址以程序計數器PC 的當前值為基地址,
* 指令中的地址標號作為偏移量,將兩者相加之后得到操作數的有效地址。
* 它是與位置無(wú)關(guān)的,主要看Boot在哪里運行,也就是PC指針在哪里 (假設_start偏移量為0),
* 例如這段代碼在 0x02000000 (FLASH起始地址)運行,即此時(shí)PC=0x02000000,那么 adr r0, _start 得到 r0 = 0x02000000;
* 如果在地址 0x81008000(Boot在RAM中加載地址)運行,即此時(shí)PC=0x81008000,那么r0就是 0x81008000 了。
*
* 此處要注意ldr與adr的區別,看下面的代碼片段:
* ldr r0, _start
* adr r0, _start
* ldr r0, =_start
* nop
* mov pc, lr
* _start:
* nop
* 下面是反匯編的結果:
* 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)
*
* 分析:
* ldr r0, _start
* 從內存地址 _start 的地方把值讀入。執行這個(gè)后,r0 = 0xe1a00000
*
* adr r0, _start
* 取得 _start 的地址到 r0,但是請看反編譯的結果,它是與位置無(wú)關(guān)的。其實(shí)取得的是相對的位置。例如這段代碼在 0x0c008000 運行,
* 那么 adr r0, _start 得到 r0 = 0x0c008014;如果在地址 0 運行,就是 0x00000014 了。即當前PC值加上_start的偏移量。
*
* ldr r0, =_start
* 這個(gè)取得標號 _start 的絕對地址。這個(gè)絕對地址是在 link 的時(shí)候確定的??瓷先ミ@只是一個(gè)指令,但是它要占用 2 個(gè) 32bit 的空間,
* 一條是指令,另一條是 _start 的數據(因為在編譯的時(shí)候不能確定 _start 的值,所以不能直接用 mov 指令來(lái)給 r0 賦一個(gè) 32bit 的常量,
* 所以需要多出一個(gè)空間存放 _start 的真正數據,這個(gè)數據是在 link 的時(shí)候確定的,在這里就是 0x0c008014)。
* 因此可以看出,這個(gè)是絕對的尋址,不管這段代碼在什么地方運行,它的結果都是 r0 = 0x0c008014
**************************************************************************/


評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>