一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

ARM LDR與MOV的區(qū)別

 敗敗0619 2012-07-04

ARM LDR與MOV的區(qū)別

KG—MOV指令、LDR指令、LDR偽指令之間的區(qū)別

MOV指令、LDR指令、LDR偽指令之間的區(qū)別

作為一個(gè)擴(kuò)展(KG),感覺這個(gè)東西還是有必要說(shuō)說(shuō)的~~

在我編譯一個(gè)工程的時(shí)候,用MOV指令編譯有的時(shí)候出錯(cuò),但是有的時(shí)候就又對(duì)了,還有LDR,怎么有的時(shí)候加個(gè)“=”有的時(shí)候有不加了,暈頭暈鬧的~~

查過(guò)相關(guān)資料后,發(fā)現(xiàn)還是有很多要知道的~~

1、“8位圖”數(shù)據(jù)

這個(gè)是必須的必要知道的~~

看一張圖片就明白了(右移~~):

KG鈥擬OV指令、LDR指令、LDR偽指令之間的區(qū)別
2、MOV指令

MOV指令可以把立即數(shù)或者寄存器內(nèi)容(注意:這里絕對(duì)不可以是內(nèi)存!?。﹤鬟f給一個(gè)寄存器。

 

對(duì)于立即數(shù)是有要求的,就是上邊的“8位圖”數(shù)據(jù)。只能由一個(gè)8bit連續(xù)有效位通過(guò)偶數(shù)次移位得到的數(shù)。

 

它為什么會(huì)有這樣的限制呢?

原因是,MOV本身就是一個(gè)32bit指令,除了指令碼本身,他不可能再帶一個(gè)可以表示32bit的數(shù)字,所以用了

其中的12bit來(lái)表示立即數(shù),其中4bit表示移位的尾數(shù)(循環(huán)右移,且數(shù)值*2),8bit

用來(lái)表示要移位的一個(gè)基數(shù)。

 

如果立即數(shù)超過(guò)這個(gè)范圍,就沒有辦法用一條MOV指令給寄存器賦值(這里就要用到LDR偽指令了,查看反匯編指令,你會(huì)看到LDR偽指令此變成了兩條指令~~)。

3、LDR指令

首先呢:

ldr指令既可以是大范圍的地址讀取偽指令,也可以內(nèi)存訪問指令。當(dāng)它的第二個(gè)參數(shù)前面有“=”時(shí),

表示偽指令,否則表示內(nèi)存訪問指令。

LDR指令就是個(gè)單寄存器存儲(chǔ)的ARM存儲(chǔ)器訪問指令。

補(bǔ)充了MOV指令不能訪問內(nèi)存的缺陷。

 

 

ARM是RISC結(jié)構(gòu)的,數(shù)據(jù)從內(nèi)存到CPU之間的移動(dòng)只能通過(guò)ldr/str指令(我說(shuō)的是但個(gè)寄存器~~)。

想要把數(shù)據(jù)從內(nèi)存中某處讀取到寄存器中,只能用ldr。

 

在X86這種CISC構(gòu)架的就沒有l(wèi)dr,因?yàn)閄86一個(gè)mov就搞定了,可以說(shuō)這就是連個(gè)芯片之間最大的區(qū)別了~~

 

 

4、LDR偽指令

1)

LDR偽指令沒有立即數(shù)范圍的限制,既,可以直接賦值。因?yàn)檫@是一條偽指令。

如果立即數(shù)在MOV的要求內(nèi),系統(tǒng)會(huì)自動(dòng)用一條匯編MOV指令來(lái)實(shí)現(xiàn)。如果不在MOV的范圍內(nèi),就用其它的方式來(lái)實(shí)現(xiàn),比如變成了兩條指令,或者從PC偏移地址讀取一個(gè)32位的數(shù)據(jù)給寄存器。

2)

關(guān)于LDR偽指令,可以裝載一個(gè)32bit立即數(shù)的說(shuō)法并不正確,因?yàn)樵趯?shí)際中并不是這一條語(yǔ)句裝載了32bit立即數(shù)(跟上面的貌似一樣,呵呵~~),比如:

ldr r1,=0x70000000

其實(shí)真正的匯編代碼是將某個(gè)地址的值傳遞給r1,就是說(shuō)需要一個(gè)地址存放0x70000000這個(gè)立即數(shù),在反匯編中,

如果仔細(xì)看會(huì)返現(xiàn),如果這個(gè)立即數(shù)可以用mov指令的表達(dá)形式來(lái)表達(dá),編譯器就直接用mov了~~

 

ARM匯編中l(wèi)dr偽指令和ldr指令

           ARM是RISC結(jié)構(gòu),數(shù)據(jù)從內(nèi)存到CPU之間的移動(dòng)只能通過(guò)L/S指令來(lái)完成,也就是ldr/str指令。比如想把數(shù)據(jù)從內(nèi)存中某處讀取到寄存器中,只能使用ldr比如:

ldr r0, 0x12345678

就是把0x12345678這個(gè)地址中的值存放到r0中。而mov不能實(shí)現(xiàn)這個(gè)功能,mov只能在寄存器之間移動(dòng)數(shù)據(jù),或者把立即數(shù)移動(dòng)到寄存器中,這個(gè)和x86這種CISC架構(gòu)的芯片區(qū)別最大的地方。x86中沒有l(wèi)dr這種指令,因?yàn)閤86的mov指令可以將數(shù)據(jù)從內(nèi)存中移動(dòng)到寄存器中。


             另外還有一個(gè)就是ldr偽指令,雖然ldr偽指令和ARM的ldr指令很像,但是作用不太一樣。ldr偽指令可以在立即數(shù)前加上=,以表示把一個(gè)值(一般是一個(gè)地址)寫到某寄存器中,比如:

ldr r0, =0x12345678

這樣,就把0x12345678這個(gè)值寫到r0中了。所以,ldr偽指令和mov是比較相似的。只不過(guò)mov指令限制了立即數(shù)的長(zhǎng)度為8位,也就是不能超過(guò)512。而ldr偽指令沒有這個(gè)限制。如果使用ldr偽指令時(shí),后面跟的立即數(shù)沒有超過(guò)8位,那么在實(shí)際匯編的時(shí)候該ldr偽指令是被轉(zhuǎn)換為mov指令的。                            其實(shí)ldr指令可以裝載一個(gè)32bit立即數(shù)的說(shuō)法并不確切,因?yàn)閷?shí)際上并不是這一條語(yǔ)句裝載了一個(gè)32bit立即數(shù),真正的匯編代碼是將某個(gè)地址的值傳遞給r1,就是說(shuō)需要一個(gè)地址存放0x12345678這個(gè)立即數(shù)。而且如果這個(gè)立即數(shù)可以用mov指令的形式來(lái)表達(dá),會(huì)被編譯器實(shí)際用mov來(lái)代替比如:

ldr r1,=0x10

會(huì)變成

mov r1,#0x10 


        綜述所述:ldr偽指令用于加載32位的立即數(shù)或一個(gè)地址值到指定寄存器。在匯編編譯源程序時(shí),ldr偽指令被編譯器替換成一條合適的指令。若加載的常數(shù)未超出mov或mvn的范圍,則使用mov或mvn指令代替該ldr偽指令,否則匯編器將常量放入文字池,并使用一條程序相對(duì)偏移的ldr指令從文字池讀出常量。
        ldr偽指令和ldr指令不是一個(gè)同東西。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    99国产一区在线播放| 国产成人亚洲欧美二区综| 国产欧美日韩视频91| 色婷婷丁香激情五月天| 久久99这里只精品热在线| 国产av大片一区二区三区| 欧美一区二区三区在线播放| 亚洲第一视频少妇人妻系列| 91午夜少妇极品福利| 午夜福利精品视频视频| 中文文精品字幕一区二区| 观看日韩精品在线视频| 色一情一乱一区二区三区码| 国产一区二区精品丝袜| 久久永久免费一区二区| 国产日本欧美特黄在线观看| 91欧美日韩国产在线观看| 亚洲熟女诱惑一区二区| 视频一区二区三区自拍偷| 欧美熟妇一区二区在线| 99国产一区在线播放| 欧美日韩精品一区免费| 日本男人女人干逼视频| 不卡一区二区在线视频| 99亚洲综合精品成人网色播| 亚洲中文字幕亲近伦片| 成年男女午夜久久久精品| 丁香六月啪啪激情综合区| 精品一区二区三区人妻视频| 91午夜少妇极品福利| 在线免费观看一二区视频| 欧美午夜色视频国产精品| 国产精品99一区二区三区| 国产麻豆一区二区三区在| 99久久人妻中文字幕| 亚洲中文字幕一区三区| 中文字幕有码视频熟女| 亚洲熟女诱惑一区二区| 国产午夜福利不卡片在线观看| 色哟哟国产精品免费视频| 国产日韩欧美国产欧美日韩|