亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 952 | 回復(fù): 0
打印 上一主題 下一主題

關(guān)于ldr和adr的理解 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-01-03 19:20 |只看該作者 |倒序瀏覽
關(guān)于ldr和adr的理解
 ARM匯編有l(wèi)dr指令以及l(fā)dr、adr偽指令,他門都可以將標(biāo)號表達(dá)式作為操作數(shù),下面通過分析一段代碼以及對應(yīng)的反匯編結(jié)果來說明它們的區(qū)別。

     ldr     r0, _start
     adr     r0, _start
     ldr     r0, =_start
_start:
        b  _start
       
編譯的時候設(shè)置 RO 為 0x30000000(運行地址,runaddress),下面是反匯編的結(jié)果:

   0x00000000: e59f0004  ldr r0, [pc, #4] ; 0xc
   0x00000004: e28f0000  add r0, pc, #0 ; 0x0
   0x00000008: e59f0000  ldr r0, [pc, #0] ; 0x10
   0x0000000c: eafffffe  b 0xc
   0x00000010: 3000000c  andcc r0, r0, ip

--------------------------------------

1.ldr r0, _start:

簡單的說就是把 _start地址存放的值讀出來。

匯編程序計算出當(dāng)前位置執(zhí)行到_start(這里是一個標(biāo)號,相對程序的位置表達(dá)式)位置pc所要增加的數(shù)值#4,然后由當(dāng)前pc(其實是當(dāng)前地址+2個指令字節(jié)長)加上偏移量#4,得到_start所在內(nèi)存地址,然后將內(nèi)存地址的值去出來放在r0中。只要此指令和標(biāo)號_start的相對位置不變,R0的值相同 0xeafffffe


2.adr r0, _start

簡單的說就是把 _start地址讀出來,而且這個地址是相對當(dāng)前pc的,所以和當(dāng)前程序運行地址相關(guān),如果在0x30000000運行,r0 = pc(0x30000004 + 0x08) + #0 = 0x3000000C;如果在0x00000000運行, r0 = pc(0x00000004 + 0x08) + #0 = 0x0000000C,所以在不同的位置運行,r0所得到的結(jié)果是不一樣的,唯一確定的相對偏移量。

U-boot中那段relocate代碼就是通過adr實現(xiàn)當(dāng)前程序是在RAM中還是flash中,下面進行簡要分析。
--------------------------------------------------------------------------------
relocate: /* 把U-Boot重新定位到RAM */
    adr r0, _start /* r0是代碼的當(dāng)前位置 */
/* adr偽指令,匯編器自動通過當(dāng)前PC的值算出 如果執(zhí)行到_start時PC的值,放到r0中:
當(dāng)此段在flash中執(zhí)行時r0 = _start = 0;當(dāng)此段在RAM中執(zhí)行時_start = _TEXT_BASE(在board/smdk2410/config.mk中指定的值為0x30000000,即u-boot在把代碼拷貝到RAM中去執(zhí)行的代碼段的開始) */
    ldr r1, TEXT_BA_SE /* 測試判斷是從Flash啟動,還是RAM */
/* 此句執(zhí)行的結(jié)果r1始終是0x30000000,因為此值是又編譯器指定的(ads中設(shè)置,或-D設(shè)置編譯器參數(shù)) */
    cmp r0, r1 /* 比較r0和r1,調(diào)試的時候不要執(zhí)行重定位 */
--------------------------------------------------------------------------------

3. ldr, r0, =_start

這是一條偽指令,取得得是_start的絕對地址,不管在身地方運行,r0 = 0x3000000C

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP