bl 和 ldr跳转程序的区别
首先說明
BL main 為相對跳轉(zhuǎn)指令,與位置無關(guān)代碼。
LDR PC,=main 為絕對跳轉(zhuǎn)指令,與位置有關(guān)代碼。
可能看到這的人都有疑問,如下圖。鏈接地址為0x50000000。
兩段代碼main函數(shù)位置如下圖:
左右圖的第11行 左邊是 bl main的反匯編為 “ bl 50000298 ”,右邊是 ldr pc,=main的反匯編為 " ldr pc,[pc, #4] "
乍一看第一個 bl 50000298 不是直接跳轉(zhuǎn)到 50000298么,那不就是絕對跳轉(zhuǎn)? ,第二個使用 ldr pc,[pc, #4],使用的時pc偏移量不是相對跳轉(zhuǎn)么?
那你就中記了。
arm-linux-objdump的反匯編太貼心了。
左邊圖:
????????????? 反匯編軟件在反匯編的時候把你的bl mian這條語句中的main的地址幫你計算了出來。但是,,它并不是按照你的實(shí)際運(yùn)行地址計算的而是按照你的鏈接地址來的,
所以就出現(xiàn)了bl 50000298;正如左邊圖示的main函數(shù)位置。
右邊圖:
??????????? ldr pc, =main這條指令為偽指令,編譯的時候會將main的鏈接地址存入一個地址。再將 ldr pc, =main轉(zhuǎn)化為 ldr pc, [ pc, offset ]這樣一個指令。所以上面的反匯編出來的 ldr pc, =main 就變成了 ldr pc. [ pc, #4 ],這句代碼相當(dāng)于? pc = *(pc+4); 由于ARM使用了流水線的原因,所以在執(zhí)行 ldr pc. [ pc, #4 ]的時候 pc 不在這句代碼這里了,而是跑到了 pc+8的地方,而 pc = *(pc + 4) = 5000029c 注意!!!!!!!! 這里的?? 5000029c? 是存在代碼段中的一個常量,并不是計算出來的,不會隨程序的位置而改變,所以無論代碼和pc怎么變 *(pc+4) 的值時不會變的。
到這還是不明白為什么bl main是相對跳轉(zhuǎn) ,ldr pc, =main是絕對跳轉(zhuǎn),反而是兩個指令都是絕對跳轉(zhuǎn)了。
上面說了,反匯編軟件在反匯編BL main時幫我們把main的地址算出來了,,那我們看看它時怎么算的,,,,,,費(fèi)了好大力氣終于找到了BL跳轉(zhuǎn)指令的計算方法(大神見笑了),看圖:(該圖取至 《ARM體系結(jié)構(gòu)與編程》--- 杜春雷 Page 59)
此時我們來模擬一下反匯編軟件的計算過程:(為方便理解我們假設(shè)程序在 50000000處執(zhí)行)
?????????? 看一下左圖 50000010 處的機(jī)器碼為 eb0000a0 轉(zhuǎn)化成二進(jìn)制就是 1110 1011 0000 0000 0000 0000 1010 0000
最高4位時條件碼 1110 就是無條件執(zhí)行 (《ARM體系結(jié)構(gòu)與編程》 Page 23)。
接著的4位 1011 是BL指令的指令碼。
后面的24位0000 0000 0000 0000 1010 0000 即為地址碼
按照其計算方式:
???? 1、將指令中24位帶符號的補(bǔ)碼立即數(shù)擴(kuò)展為32位(擴(kuò)展其符號位)
??????????? 原數(shù)變成? 0000 0000 0000 0000 0000 0000 1010 0000
???? 2、將此數(shù)左移兩位
??????????? 變成??? 0000 0000 0000 0000 0000 0010 1000 0000 =? 0x280
???? 3、將得到的值加到PC寄存器中得到目標(biāo)地址
?????????? 由于ARM流水線原因 此時的 pc = 0x50000010+8 = 0x50000018
?????????? pc = pc + 0x280 = 0x50000298與左邊圖中的mian的地址相等。程序就跳轉(zhuǎn)到了mian
在算的過程中我們使用的始終是PC的值,假設(shè)程序在 0 地址處執(zhí)行,那么計算方法一樣,pc 的值變了計算出來的結(jié)果也隨之改變。所以 BL 的跳轉(zhuǎn)時與位置無關(guān)的
轉(zhuǎn)載自https://blog.csdn.net/xshenpan/article/details/49337845
總結(jié)
以上是生活随笔為你收集整理的bl 和 ldr跳转程序的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android锁机样本分析
- 下一篇: arm 跳转指令跳转范围