久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4679|回復(fù): 1
收起左側(cè)

ARM指令adr adrl ldr mov是什么,ldr和adr區(qū)別在哪里?

[復(fù)制鏈接]
ID:230303 發(fā)表于 2017-9-7 16:35 | 顯示全部樓層 |閱讀模式
ARM指令:什么是adr adrl ldr mov?
ADR是一條小范圍的地址讀取偽指令,它將基于PC的相對(duì)偏移的地址值讀到目標(biāo)寄存器中。格式:ADR register,exper。
編譯源程序時(shí),匯編器首先計(jì)算當(dāng)前PC值(當(dāng)前指令位置)到exper的距離,然后用一條ADD或者SUB指令替換這條偽指令,

      例如:ADD register,PC,#offset_to_exper。
      注意,標(biāo)號(hào)exper與指令必須在同一代碼段。
      比如:adr r0, _start ://將指定地址賦到r0中
      ……
      _start:
      b _start
      r0的值為標(biāo)號(hào)_start與此指令的距離差 + PC值。

ADRL:
這是一條中等范圍的地址讀取偽指令,它將基于PC的相對(duì)偏移的地址值讀到目標(biāo)寄存器中。格式:ADRL register,exper。編譯源程序時(shí),匯編器會(huì)用兩條合適的指令替換這條偽指令。

      比如:
      ADD register,PC,offset1
      ADD register,register,offset2
      與ADR相比,它能讀取更大范圍的地址。
      注意,標(biāo)號(hào)exper與指令必須在同一代碼段。
      接下來是LDR,首先要說兩個(gè)家伙,他們都叫LDR。
      一個(gè)是LDR偽指令,一個(gè)是LDR指令,名字相同卻不是一個(gè)東西。
      區(qū)分的方法就是看第二個(gè)參數(shù),如果有等號(hào),就是偽指令。

LDR指令:

      例: ldr r0, 0x12345678
      是把0x12345678這個(gè)地址中的值存放到r0中。而mov不能干這個(gè)活,mov只能在寄存器之間移動(dòng)數(shù)據(jù),或者把立即數(shù)移動(dòng)到寄存器中。

LDR偽指令:

      例1(立即數(shù)): ldr r0, =0x12345678
      這樣,就把0x12345678這個(gè)地址寫到r0中了。所以,ldr偽指令和mov是比較相似的。只不過mov指令限制了立即數(shù)的長(zhǎng)度為8位,也就是不能超過512。而ldr偽指令沒有這個(gè)限制。如果使用ldr偽指令,后面跟的立即數(shù)沒有超過8位,那么在實(shí)際匯編的時(shí)候該ldr偽指令會(huì)被轉(zhuǎn)換為mov指令。
      例2(標(biāo)號(hào)): ldr r0, =_start //將指定標(biāo)號(hào)的值賦給r0
      這里取得的是標(biāo)號(hào)_start的絕對(duì)地址,這個(gè)絕對(duì)地址(運(yùn)行地址)是在鏈接的時(shí)候確定的。它要占用 2 個(gè)32bit的空間,一條是指令,另一條是文字池中存放_(tái)start 的絕對(duì)地址。
      對(duì)比adr r0, _start和 ldr r0, =_start
      它們的目的一樣,都是把標(biāo)簽的賦給r0,區(qū)別---左邊是相對(duì)地址,右邊絕對(duì)地址。目的一樣,但結(jié)果不一定相同。結(jié)果是否相同,要看PC值是否和鏈接地址相同。

ldr 和 adr 的區(qū)別在哪里?

很多人在寫簡(jiǎn)單的裸機(jī)代碼或分析uboot時(shí),常常遇到adr ldr指令。卻分不清這2者的區(qū)別,今天就來談?wù)刟dr與ldr指令。
參照韋老師的代碼和Makefile寫了test_adr.S
9681d7b5259b4122b7042244943275be.jpeg
Makefile:
135de2fbe8a3441692780f81c60c7dbc.jpeg
反匯編test_adr.S得到test_adr.dis:
7eaab7b6d47d4d82bee3159cbfd307d1.jpeg
很顯然,ldr獲取的是內(nèi)存的值(至于這個(gè)內(nèi)存存的是數(shù)據(jù)還是地址,不是問題重點(diǎn)),像指針一樣間接尋址(看到了〔〕符號(hào)咯),而adr是得到一個(gè)與PC有關(guān)的值,必定是個(gè)地址。
韋老師舉了個(gè)例子:
adr r0, _start,r0就是_start對(duì)應(yīng)指令當(dāng)前的地址
對(duì)于“_start對(duì)應(yīng)指令當(dāng)前的地址”,我理解了很久,終于想清楚,比如在uboot中,_start標(biāo)號(hào)對(duì)應(yīng)的指令(即b reset)的鏈接地址是0x33f80000確鑿無疑。
如果從NOR Flash啟動(dòng),b reset被燒在NOR Flash 0地址,那么b reset相對(duì)于此時(shí)的PC來說,它的地址就是0。
如果u-boot被直接下載到SDRAM的0x33f80000處運(yùn)行,那么b reset自然處在SDRAM的0x33f80000。
所謂“當(dāng)前”---是以運(yùn)行時(shí)的PC為參照。
下面基于以上理解,分析test_adr.dis
a8b3b1ebb9a149588b7dac39efd6a993.jpeg
1、先分析第一條指令ldr r0,test被編譯成ldr
r0, 〔pc, #8〕,即到當(dāng)前PC+8的存儲(chǔ)器取值,運(yùn)行第一條指令時(shí),PC其實(shí)已經(jīng)是8了(流水線決定的)。
那么8+8等于0x10,所以r0等于e1a00000,此指令的作用就是讀取test地址處存放的值。由于此處放了一條nop,即得到nop的機(jī)器碼。
2、第二條adr r0,test被編譯成add r0, pc, #4
這顯然是依賴程序執(zhí)行到此處的PC值。ADR是小范圍地址讀取偽指令,會(huì)將基于PC 相對(duì)偏移的地址值讀取到寄存器中,此指令在4地址,PC是4+8=0xc再加4,于是r0=0x10。
從結(jié)果上來看,test自身的值(標(biāo)號(hào)值),被讀到了r0,這個(gè)值是以PC為參考的,也就是test對(duì)應(yīng)的指令(第二個(gè)nop)當(dāng)前的地址。r0=(標(biāo)號(hào)test的地址與此指令的距離差)+(此指令的地址)=((0x10-0x4=12)+(4))=16=0x10。
假如在0x30000000以上運(yùn)行,r0=((12)+(0x30000004))= 0x30000010。
3、ldr r0,=test被編譯成兩個(gè)字,一個(gè)指令,一個(gè)文字池
執(zhí)行到這里PC=8, 8+8+4=0x14,所以在14地址取值,編譯器在14地址處放了0x00000010,0x00000010是test的值,假如在Makefile指定連接地址是0x30000000,那么編譯器放在這里的就是0x30000010,可見,這個(gè)值是編譯時(shí)確定的。
最后一行andeq r0, r0, r0, lsl r0大概是編譯器的機(jī)械動(dòng)作,把一個(gè)數(shù)字翻譯成了指令。
總結(jié)
ADR是小范圍的地址讀取偽指令,它將基于PC 相對(duì)偏移的地址值讀取到寄存器中。而ldr獲取的是內(nèi)存的值,像指針一樣間接尋址。

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:233430 發(fā)表于 2017-9-16 09:15 | 顯示全部樓層
樓主講的很好!頓時(shí)明白了,謝謝樓主解析,么么
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 蜜桃视频一区二区三区 | 蜜桃视频在线观看www社区 | 亚洲电影免费 | 国产成人免费视频网站视频社区 | 久久久精品一区二区 | 亚洲精品www. | 欧美在线二区 | 91性高湖久久久久久久久_久久99 | 精品久久久久久久久久 | 天堂素人约啪 | 日本小电影网站 | 精品国产一区二区三区久久久久久 | 一区二区三区久久 | 91在线一区二区 | 成人免费小视频 | 午夜精品久久久久久久99黑人 | 色播视频在线观看 | 国产一区久久 | 久久婷婷麻豆国产91天堂 | 欧美激情久久久 | 天堂视频一区 | 免费在线成人 | 久久99深爱久久99精品 | 天堂在线免费视频 | 九九热在线视频 | 久久美女网 | 91天堂网 | 一二区视频 | 久久久久久久夜 | 日韩欧美一区二区三区免费观看 | 亚洲欧洲小视频 | 日韩一区二区三区在线播放 | 一级一级毛片免费看 | 黄色成人国产 | 国产欧美精品区一区二区三区 | 欧美国产精品 | 精品久久久久国产 | 成年人免费网站 | 激情欧美日韩一区二区 | 日日夜夜精品免费视频 | 中国美女撒尿txxxxx视频 |