新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM匯編中l(wèi)dr與adr的區(qū)別

        ARM匯編中l(wèi)dr與adr的區(qū)別

        作者: 時(shí)間:2016-11-23 來(lái)源:網(wǎng)絡(luò) 收藏
        ldr r0, _start

        adr r0, _start

        本文引用地址:http://www.104case.com/article/201611/320509.htm

        ldr r0, =_start

        nop

        mov pc, lr

        _start:

        nop

        編譯的時(shí)候設(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í)行這個(gè)后,r0 = 0xe1a00000

        adr r0, _start

        取得 _start 的地址到 r0,但是請(qǐng)看反編譯的結(jié)果,它是與位置無(wú)關(guān)的。其實(shí)取得的時(shí)相對(duì)的位置。例如這段代碼在 0x0c008000 運(yùn)行,那么 adr r0, _start 得到 r0 = 0x0c008014;如果在地址 0 運(yùn)行,就是 0x00000014 了。

        ldr r0, =_start

        這個(gè)取得標(biāo)號(hào) _start 的絕對(duì)地址。這個(gè)絕對(duì)地址是在 link 的時(shí)候確定的。看上去這只是一個(gè)指令,但是它要占用 2 個(gè) 32bit 的空間,一條是指令,另一條是 _start 的數(shù)據(jù)(因?yàn)樵诰幾g的時(shí)候不能確定 _start 的值,而且也不能用 mov 指令來(lái)給 r0 賦一個(gè) 32bit 的常量,所以需要多出一個(gè)空間存放 _start 的真正數(shù)據(jù),在這里就是 0x0c008014)。

        因此可以看出,這個(gè)是絕對(duì)的尋址,不管這段代碼在什么地方運(yùn)行,它的結(jié)果都是 r0 = 0x0c008014



        關(guān)鍵詞: ARM匯編ldrad

        評(píng)論


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

        關(guān)閉
        主站蜘蛛池模板: 东莞市| 永德县| 屏东市| 梁平县| 韶山市| 于田县| 塘沽区| 隆回县| 新河县| 溧阳市| 枝江市| 广宁县| 汶上县| 桃源县| 萍乡市| 郯城县| 白城市| 诏安县| 泊头市| 阜宁县| 连南| 勐海县| 钟祥市| 普兰店市| 乐山市| 抚松县| 镇康县| 北票市| 盈江县| 正蓝旗| 马龙县| 枣强县| 嘉祥县| 邮箱| 云和县| 钟祥市| 满城县| 安新县| 磐安县| 常熟市| 宁波市|