匯編語(yǔ)言LDR指令和LDR偽指令詳解
LDR指令和LDR偽指令詳解
ARM32位指令的構(gòu)成
ARM是RISC結(jié)構(gòu),數(shù)據(jù)從內(nèi)存到CPU之間的移動(dòng)只能通過(guò)LDR/STR指令來(lái)完成。 32bit = 指令碼 + 數(shù)據(jù)。所以32bit的一條指令不可能表示再帶一個(gè)32bit的數(shù)據(jù),實(shí)際只有其中的12bit來(lái)表示立即數(shù),其中4bit表示移位的位數(shù)(循環(huán)右移,且數(shù)值x2),8bit用來(lái)表示要移位的一個(gè)基數(shù)。這就產(chǎn)生了非法立即數(shù)和合法立即數(shù)的問(wèn)題,經(jīng)過(guò)移位操作,不為零的部分不能用8bit表示的數(shù)就是非法立即數(shù)。ldr偽指令就是用來(lái)解決非法立即數(shù)問(wèn)題的。
ldr指令和ldr偽指令的使用區(qū)別:
ldr r0, =0xFFF0 @偽指令
ldr r0, 0xFFFF @指令
直觀的區(qū)別就是ldr偽指令使用時(shí),后面的數(shù)據(jù)前會(huì)有"=",實(shí)際使用時(shí),大部分都使用偽指令,這樣就不用考慮合法和非法立即數(shù)的問(wèn)題。在編譯的時(shí)候,編譯器會(huì)將ldr偽指令進(jìn)行替換,用文字池的方式來(lái)解決非法立即數(shù)的問(wèn)題。文字池就是劃分出一段地址空間用來(lái)存放常量或者地址,需要時(shí)用基址+變址的方式去取數(shù)據(jù),這樣就不用受到合法立即數(shù)的限制,可以表示32bit的數(shù)據(jù)。例如:
匯編源代碼:
_start:
ldr r0, =0x11111111
經(jīng)過(guò)反匯編:
00000000 <_start>:
0: e59f009c ldr r0, [pc, #156] ; a4 <delay_loop+0x10>
·
·
·
98: e1520003 cmp r2, r3
9c: 1afffffc bne 94 <delay_loop>
a0: e1a0f00e mov pc, lr
a4: 11111111 tstne r1, r1, lsl r1
分析:
通過(guò)反匯編可以看到,ldr偽指令被一條寄存器基址變址指令給替代了。其中以pc為基址,偏移156個(gè)字節(jié)(16進(jìn)制是0x9c)。這條指令的作用是將內(nèi)存地址"pc + 156"開(kāi)頭的4個(gè)字節(jié)讀取到r0中,此時(shí)pc的值等于當(dāng)前執(zhí)行指令的地址+8(因?yàn)榱魉€的原因),因此pc + 156 = 0xa4,而0xa4地址處存的值剛好是0x11111111。這樣就完成了將0x11111111加載到r0。
補(bǔ)充1:
RAM處理器存在流水線,目前已經(jīng)有十幾級(jí)流水線,但是ARM為了兼容,無(wú)論Soc有多少級(jí)流水線,PC的值都是等于當(dāng)前指令地址 + 8。PC = 當(dāng)前指令地址 + 8, 記住就行。
補(bǔ)充2:
匯編語(yǔ)言ldr偽指令
偽指令是用來(lái)自動(dòng)拆分代碼值的,會(huì)把一條語(yǔ)句拆分成多條語(yǔ)句。
示例:
/* 匯編點(diǎn)亮一個(gè) LED 燈 */ .text .global _start _start: ldr r1, =0x56000050 ldr r0, =0x100 /* 相當(dāng)于 mov r0, #0x100 */ str r0, [r1] ldr r1, =0x56000054 ldr r0, =0 /* mov r0, #0 */ str r0, [r1] halt: b halt
ldr r1, =0x56000054就是一條偽指令,假設(shè)我們想把56000054值給r1寄存器,可以用 mov r1, #56000050 ,
但是長(zhǎng)度超出了mov 能接收的長(zhǎng)度,就要分為高低字節(jié)去發(fā)送,但是在某些時(shí)候我們還要去看開(kāi)放文檔,才能知道
或者沒(méi)有開(kāi)發(fā)文檔,那就讓偽指令自己去判斷。
到此這篇關(guān)于匯編語(yǔ)言LDR指令和LDR偽指令詳解的文章就介紹到這了,更多相關(guān)匯編語(yǔ)言ldr偽指令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
匯編語(yǔ)言XOR指令:對(duì)兩個(gè)操作數(shù)進(jìn)行邏輯(按位)異或操作(推薦)
匯編語(yǔ)言(assembly language)是一種用于電子計(jì)算機(jī)、微處理器、微控制器或其他可編程器件的低級(jí)語(yǔ)言,亦稱為符號(hào)語(yǔ)言。這篇文章主要介紹了匯編語(yǔ)言XOR指令:對(duì)兩個(gè)操作數(shù)進(jìn)行邏輯(按位)異或操作,需要的朋友可以參考下2020-01-01Go 中的循環(huán)是如何轉(zhuǎn)為匯編的(方法詳解)
這篇文章主要介紹了Go 中的循環(huán)是如何轉(zhuǎn)為匯編的,本文通過(guò)循環(huán)的匯編代碼給大家講解的非常詳細(xì),代碼簡(jiǎn)單易懂,非常不錯(cuò),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05os_object_release Crash 排查記錄分析
這篇文章主要為大家介紹了os_object_release Crash 排查記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11匯編語(yǔ)言學(xué)習(xí)手把手的Debug教程
這篇文章主要為大家分介紹了匯編語(yǔ)言學(xué)習(xí)的Debug教程內(nèi)容,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11匯編語(yǔ)言位向量(位映射)的實(shí)現(xiàn)
這篇文章主要介紹了匯編語(yǔ)言位向量(位映射)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01