国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

詳解匯編語(yǔ)言B和LDR指令與相對(duì)跳轉(zhuǎn)和絕對(duì)跳轉(zhuǎn)的關(guān)系

開(kāi)發(fā) 前端
為什么要有相對(duì)跳轉(zhuǎn)和絕對(duì)跳轉(zhuǎn)?順序執(zhí)行:指令一條一條按照順序往下執(zhí)行,比如變量的定義和賦值都是按照順序執(zhí)行的。跳轉(zhuǎn)執(zhí)行:當(dāng)指令執(zhí)行到當(dāng)前位置后跳轉(zhuǎn)到其他位置執(zhí)行。

為什么要有相對(duì)跳轉(zhuǎn)和絕對(duì)跳轉(zhuǎn)?

順序執(zhí)行:指令一條一條按照順序往下執(zhí)行,比如變量的定義和賦值都是按照順序執(zhí)行的。跳轉(zhuǎn)執(zhí)行:當(dāng)指令執(zhí)行到當(dāng)前位置后跳轉(zhuǎn)到其他位置執(zhí)行。比如,在主函數(shù)中調(diào)用其他函數(shù)就是典型的跳轉(zhuǎn)執(zhí)行。其中跳轉(zhuǎn)又分為絕對(duì)跳轉(zhuǎn)和相對(duì)跳轉(zhuǎn)。絕對(duì)跳轉(zhuǎn):直接跳轉(zhuǎn)到一個(gè)固定的,實(shí)實(shí)在在的地址。相對(duì)跳轉(zhuǎn):相對(duì)于當(dāng)前pc值的一個(gè)跳轉(zhuǎn),跳轉(zhuǎn)到pc+offset的地址。

[[358572]]

我們清楚了上面幾個(gè)概念,就知道了為什么要有相對(duì)跳轉(zhuǎn)和絕對(duì)跳轉(zhuǎn)。各種指令相互配合才能使得cpu有更高的處理效率。正是因?yàn)橛辛隧樞蚝吞D(zhuǎn)指令,我們的cpu才可以處理各種復(fù)雜的計(jì)算。

在程序中只有相對(duì)跳轉(zhuǎn)/絕對(duì)跳轉(zhuǎn)是否可以?

答案肯定是不可以的。我們以一個(gè)例子具體分析。指令編號(hào) | 指令功能-------- | -----| -----指令1 | 順序執(zhí)行指令2 | 順序執(zhí)行指令3 |相對(duì)跳轉(zhuǎn)到指令5指令4 | 順序執(zhí)行指令5 | 順序執(zhí)行指令6 | 絕對(duì)跳轉(zhuǎn)到指令8指令7 | 順序執(zhí)行指令8 | 順序執(zhí)行

假設(shè)程序被放在0x00000000位置開(kāi)始執(zhí)行,編譯鏈接后的結(jié)果為:

  • 指令地址 | 指令編號(hào) | 指令功能 | 下條指令地址-------- | -----| -----| -----| -----0x00000000 | 順序執(zhí)行| 順序執(zhí)行| 當(dāng)前地址+40x00000004 | 順序執(zhí)行| 順序執(zhí)行| 當(dāng)前地址+40x00000008 |跳轉(zhuǎn)到指令5|跳轉(zhuǎn)到指令5|當(dāng)前地址+80x0000000C | 順序執(zhí)行 | 順序執(zhí)行 | 當(dāng)前地址+40x00000010 | 順序執(zhí)行 | 順序執(zhí)行 | 當(dāng)前地址+40x00000014 | 跳轉(zhuǎn)到指令8| 跳轉(zhuǎn)到指令8| 0xC000001C0x00000018 | 順序執(zhí)行| 順序執(zhí)行|當(dāng)前地址+40x0000001C | 順序執(zhí)行 | 順序執(zhí)行 | 當(dāng)前地址+4

 

詳解匯編語(yǔ)言B和LDR指令與相對(duì)跳轉(zhuǎn)和絕對(duì)跳轉(zhuǎn)的關(guān)系

當(dāng)這段程序被放在0xC000000空間時(shí),開(kāi)始執(zhí)行指令1,然后采用相對(duì)尋址的方法就可以運(yùn)行到指令6,在指令6執(zhí)行時(shí)也可以使用絕對(duì)尋址的方法從0xC0000014正確跳轉(zhuǎn)到指令8所在的0xC00001C位置,這段代碼運(yùn)行正常。

當(dāng)這段代碼被放在0x00000000空間時(shí),開(kāi)始執(zhí)行指令1,然后采用相對(duì)尋址的方法就可以運(yùn)行到指令6,但在指令6執(zhí)行時(shí)使用絕對(duì)尋址的方法從0x0000014跳轉(zhuǎn)到了0xC000001C,但0xC000001C空間沒(méi)有代碼,這樣程序就跑飛了。

因此,當(dāng)編譯地址(加載地址)和運(yùn)行地址相同時(shí),絕對(duì)跳轉(zhuǎn)和相對(duì)跳轉(zhuǎn)都可以正確執(zhí)行。比如,程序在NORFLASH存儲(chǔ)時(shí)。但是,當(dāng)編譯地址(加載地址)和運(yùn)行地址不相同時(shí),相對(duì)跳轉(zhuǎn)都就會(huì)出現(xiàn)問(wèn)題。比如,代碼存儲(chǔ)在NANDFLASH,由于NANDFLASH并不能運(yùn)行代碼,所以需要重定位代碼到內(nèi)部的SRAM。關(guān)于NANDFLASH和NORFLASH可以看這篇文章S3C2440從NAND Flash啟動(dòng)和NOR FLASH啟動(dòng)的問(wèn)題。

B(BL)和LDR指令具體怎么執(zhí)行的?

我們以下圖中的這句跳轉(zhuǎn)代碼分析下指令具體的執(zhí)行過(guò)程。

 

  1. #ifndef CONFIG_SKIP_LOWLEVEL_INIT 
  2.     bl    cpu_init_crit 
  3. #endif 

  上述代碼對(duì)應(yīng)的反匯編代碼如下:

 

  1. 33f000ac:    eb000017     bl    33f00110 <cpu_init_crit> 
  2.  
  3. 33f00110 <cpu_init_crit>: 
  4. 33f00110:    e3a00000     mov    r0, #0    ; 0x0 
  5. 33f00114:    ee070f17     mcr    15, 0, r0, cr7, cr7, {0} 

當(dāng)指令執(zhí)行到33f000ac時(shí),對(duì)應(yīng)的機(jī)器碼為eb000017(1110 1011 0000 0000 0000 0000 0001 0111‬),其中[31,28]高四位為條件碼,1110表示無(wú)條件執(zhí)行。[25,27]位保留區(qū)域,24位表示是否帶有返回值,1表示帶有返回值,也就是BL指令。[23,0]為指令的操作數(shù),0000 0000 0000 0000 0001 0111。按照如下計(jì)算方式:

  • 將指令中24位帶符號(hào)的補(bǔ)碼立即數(shù)擴(kuò)展為32位(擴(kuò)展其符號(hào)位)原數(shù)變成 0000 0000 0000 0000 0000 0000 0001 0111。
  • 將此數(shù)左移兩位0000 0000 0000 0000 0000 0010 1000 0000 變成 0000 0000 0000 0000 0000 0000 0101 1100 = 0x0000005c
  • 將得到的值加到PC寄存器中得到目標(biāo)地址,由于ARM為3級(jí)流水線,此時(shí)的 pc = 33f000ac+8 = 33F000B4,pc = 33F000B4 + 0x0000005c = 33F00110‬與圖中的cpu_init_crit的地址相等。

在算的過(guò)程中我們使用的始終是PC的值,假設(shè)程序在 0 地址處執(zhí)行,那么計(jì)算方法一樣,pc 的值變了計(jì)算出來(lái)的結(jié)果也隨之改變。所以 BL 的跳轉(zhuǎn)時(shí)與位置無(wú)關(guān)的。

下圖為B(BL)指令的格式

詳解匯編語(yǔ)言B和LDR指令與相對(duì)跳轉(zhuǎn)和絕對(duì)跳轉(zhuǎn)的關(guān)系

28~31bts(cond)是條件碼,就是表明這條語(yǔ)句里是否有大于、等于、非零等的條件判斷,這4bts共有16種狀態(tài),分別為:

詳解匯編語(yǔ)言B和LDR指令與相對(duì)跳轉(zhuǎn)和絕對(duì)跳轉(zhuǎn)的關(guān)系

下圖為L(zhǎng)DR指令的格式

詳解匯編語(yǔ)言B和LDR指令與相對(duì)跳轉(zhuǎn)和絕對(duì)跳轉(zhuǎn)的關(guān)系
詳解匯編語(yǔ)言B和LDR指令與相對(duì)跳轉(zhuǎn)和絕對(duì)跳轉(zhuǎn)的關(guān)系

  我們以下圖中的第一句話作為例子分析下

  1. ldr pc,=call_board_init_f 

對(duì)應(yīng)的反匯編代碼如下:

 

  1. 33f000d0:    e59ff324     ldr    pc, [pc, #804]    ; 33f003fc <fiq+0x5c> 
  2.  
  3. 33f003fc:    33f000d4     .word    0x33f000d4 
  4. ........ 
  5. 33f000d4 <call_board_init_f>: 
  6. 33f000d4:    e3a00000     mov    r0, #0    ; 0x0 

ldr pc, [pc, #804]這條指令為偽指令,編譯的時(shí)候會(huì)將call_board_init_f的鏈接地址存入一個(gè)固定的地址(鏈接時(shí)確定的),對(duì)于本條指令這個(gè)地址就是33f000d4 。上面的反匯編出來(lái)的 ldr pc,=call_board_init_f就變成了ldr pc, [pc, #804],由于ARM使用了流水線的原因,所以在執(zhí)行 ldr pc. [ pc, #4 ]的時(shí)候 pc 不在這句代碼這里了,而是跑到了 pc+8的地方,這句代碼相當(dāng)于 pc = *(pc+804+8)=33f000d0+32C=33f003fc ,所以會(huì)跳轉(zhuǎn)到33f003fc 地址取33f000d4 ,而33f000d4 是存在代碼段中的一個(gè)常量,并不是計(jì)算出來(lái)的,不會(huì)隨程序的位置而改變,所以無(wú)論代碼和pc怎么變 *(pc+804) 的值時(shí)不會(huì)變的。

這樣,絕對(duì)跳轉(zhuǎn)中的固定地址就很好理解了,要跳轉(zhuǎn)地址的值在鏈接時(shí)就已經(jīng)確定了,存在了一塊內(nèi)存中。而相對(duì)跳轉(zhuǎn)時(shí),反匯編bl 33f00110中的33f00110是根據(jù)pc計(jì)算出來(lái)的,當(dāng)pc改變時(shí),結(jié)果也會(huì)改變,所以,稱(chēng)為相對(duì)跳轉(zhuǎn),與當(dāng)前位置無(wú)關(guān)。

B(BL)和LDR跳轉(zhuǎn)范圍是如何規(guī)定的?

下圖為B(BL)指令的格式

詳解匯編語(yǔ)言B和LDR指令與相對(duì)跳轉(zhuǎn)和絕對(duì)跳轉(zhuǎn)的關(guān)系

BL指令的[23,0]bits存放的是要跳轉(zhuǎn)的相對(duì)地址,由于指令所在地址必須是4字節(jié)對(duì)齊的,因此跳轉(zhuǎn)的地址最低bits必然是0,因此BL指令[23,0]bits保存的是省略這最低2bts的地址,如果補(bǔ)全了這2bits,BL指令就可以表示26bits的跳轉(zhuǎn)地址。在這26bits中需要使用1bit表示向前跳還是向后跳,那么剩下的25bits就可以表示32 MBts的范圍了,225=32M因此,B(BL)指令的跳轉(zhuǎn)范圍為-32MBytes~+32MBytes。

下圖為L(zhǎng)DR指令的格式

詳解匯編語(yǔ)言B和LDR指令與相對(duì)跳轉(zhuǎn)和絕對(duì)跳轉(zhuǎn)的關(guān)系
詳解匯編語(yǔ)言B和LDR指令與相對(duì)跳轉(zhuǎn)和絕對(duì)跳轉(zhuǎn)的關(guān)系

圖中的LDR的跳轉(zhuǎn)范圍計(jì)算方式和B指令的類(lèi)似,其中Rn和Address_mode共同構(gòu)成第二個(gè)操作數(shù)的內(nèi)存地址,由Address_mode的9種格式可以直到,Address_mode表示的就是偏移地址的范圍大小,為212=4K。(不理解的可以對(duì)比下ldr pc, [pc, #804]和Address_mode的九種格式,很明顯可以看出Address_mode就是當(dāng)前地址的偏移范圍)

責(zé)任編輯:未麗燕 來(lái)源: 今日頭條
相關(guān)推薦

2023-06-01 16:27:34

匯編語(yǔ)言函數(shù)

2010-11-09 09:51:52

匯編語(yǔ)言

2018-09-07 18:25:47

2011-01-14 14:08:17

Linux匯編語(yǔ)言

2010-09-10 12:40:06

CSS相對(duì)定位CSS絕對(duì)定位

2015-03-30 14:03:13

ActivityGroActivity跳轉(zhuǎn)

2010-09-10 11:32:23

CSS絕對(duì)定位CSS相對(duì)定位

2022-08-13 12:13:13

RTOS延時(shí)代碼

2011-01-14 14:39:32

Linux匯編語(yǔ)言

2010-08-16 11:28:02

DIV

2010-03-18 08:48:30

Python入門(mén)

2012-02-09 09:00:54

匯編語(yǔ)言

2021-03-10 12:43:06

LDR指令函數(shù)

2010-09-14 16:39:26

CSS DIV相對(duì)定位CSS DIV絕對(duì)定位

2010-09-06 11:17:19

CSS相對(duì)定位CSS絕對(duì)定位

2010-08-26 16:48:48

DIV絕對(duì)定位相對(duì)定位

2011-01-14 14:15:11

Linux匯編語(yǔ)言

2021-06-11 10:02:39

語(yǔ)言編程開(kāi)發(fā)

2011-01-14 14:22:50

Linux匯編語(yǔ)言

2011-01-04 17:08:10

匯編語(yǔ)言
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

а√天堂在线官网| 日本三级视频在线观看| 一区久久精品| 国产91精品不卡视频| 成人在线黄色电影| 欧美日韩视频一区二区| 国产香蕉视频在线观看| 久久精品夜夜夜夜久久| 国产在线拍揄自揄拍无码| 一区在线视频观看| 91在线网站视频| av中文一区| 日本成人黄色片| 性人久久久久| 77777亚洲午夜久久多人| 精品一级视频| 久久成人这里只有精品| 中文.日本.精品| 亚洲日本欧美日韩高观看| 国产无遮挡裸体视频在线观看| 欧美一区二区性放荡片| 日本免费中文字幕在线| 在线成人小视频| 岛国中文字幕在线| 日韩一区二区视频| caoporn免费在线| 亚洲国产精品99久久| 欧美a级在线观看| 一区二区三区在线播放欧美| 亚洲精品一区三区三区在线观看| 神马久久久久久| 欧洲大片精品免费永久看nba| 欧美成人免费全部观看天天性色| 亚洲精品555| 欧美国产激情18| 欧美大片网址| 91精品免费久久久久久久久| 日韩欧美一区二区三区免费看| 成人有码在线播放| 亚洲影视综合| 精品人妻大屁股白浆无码| 99免费精品在线| 三级在线免费看| 亚洲另类在线一区| 玖玖综合伊人| 欧美v日韩v国产v| 成人在线视频国产| 国产精品国产亚洲伊人久久| 国产精品vip| 国产人妻互换一区二区| 成人美女在线观看| 国产不卡视频| 91精品国产福利在线观看| 松下纱荣子在线观看| 欧美成人黑人xx视频免费观看| 亚洲香蕉视频| 日韩国产高清一区| 久久精品一区二区三区不卡| 色播色播色播色播色播在线 | 123成人网| 91精品国产91久久久| 欧美.www| 九一国产精品视频| 欧美日韩一区二区精品| 亚洲精品永久免费视频| 91a在线视频| 免费观看在线综合色| 日本成人免费网站| 日韩一卡二卡三卡| 成人h动漫免费观看网站| 国产日韩一区二区| 久久久91精品国产一区二区精品 | 欧美在线影院一区二区| 中文在线а√天堂| 91精品国产91久久久久久最新 | 成人18视频日本| 视频福利在线| 久久精品久久精品亚洲人| 在线成人激情| 国产主播在线看| 欧美一级搡bbbb搡bbbb| 噜噜噜天天躁狠狠躁夜夜精品| 欧美在线3区| 亚洲最新在线观看| 欧美激情不卡| 玛丽玛丽电影原版免费观看1977| 国产精品女主播在线观看| 国产在线69| 国产精品久久久久久久久久久新郎| 九色综合国产一区二区三区| 在线观看免费毛片| 久久伊人精品天天| 麻豆精品久久精品色综合| 精品国产一区二区三区四区阿崩| 国产一区二区av| 久久精品1区| 天堂在线中文资源| 色综合久久悠悠| 国产一区二区不卡老阿姨| 成人高清免费观看mv| 国产精品扒开腿做爽爽爽男男| av网站一区二区三区| 国产在线观看www| 九九九九精品| 亚洲国产裸拍裸体视频在线观看乱了 | 色妞久久福利网| 另类国产ts人妖高潮视频| 五月天丁香婷| 久久久久久久网站| 成人av午夜电影| 中文字幕成在线观看| 免费久久一级欧美特大黄| 狠狠躁夜夜躁人人躁婷婷91 | 欧美区国产区| 色琪琪丁香婷婷综合久久| 插插插亚洲综合网| 国产乱子伦视频一区二区三区| 韩国福利在线| 91日本在线视频| 亚洲国产精品久久一线不卡| 操欧美女人视频| 亚洲成年人专区| 亚洲成人网av| 日韩国产欧美在线观看| 秋霞午夜在线观看| 成人xxxxx色| 欧美午夜一区二区三区免费大片| 香蕉视频国产精品| 精品一二三区视频| 波多野结衣久草一区| 欧美性猛交xxxx久久久| 亚洲不卡av不卡一区二区| 亚洲热app| 91日本在线观看| 色婷婷国产精品综合在线观看| 日韩在线视频精品| 亚洲一区二区精品久久av| 久久中文在线| 久久久精品黄色| 在线不卡a资源高清| 日本久久中文字幕| 欧美激情免费观看| 在线看福利67194| 同产精品九九九| 一区在线播放视频| 美女视频一区在线观看| 视频一区中文字幕| 超碰高清在线| jizzjizz在线观看| 青青久在线视频免费观看| 亚洲第一二三区| 天天久久夜夜| 成人中文字幕视频| 色琪琪久久se色| 黄色软件视频在线观看| 日韩电影免费观看| 99久久香蕉| 午夜国产一区二区| 成人免费观看视频| 欧美日本视频在线| 国产91精品久久久久久| 国产精品视频精品视频| 亚洲一区亚洲二区亚洲三区| 日韩欧美一级二级三级| 亚洲视频网站在线观看| 亚洲视频第一页| 国产成人精品视频在线观看| 国产精品美女久久| 国产91在线高潮白浆在线观看| 青青青国产精品一区二区| 日韩片电影在线免费观看| 久久久久久久久久久福利| jk破处视频在线| 最新真实国产在线视频| 波多野结衣欧美| 久久狠狠婷婷| 国产亚洲一卡2卡3卡4卡新区| 久久国产欧美| 久久久亚洲精品石原莉奈| 国产亚洲精品久| 日韩精品在线视频| 国产美女被下药99| 日韩在线无毛| 国产麻豆一区二区三区| 国模大胆一区二区三区| 老牛影视一区二区三区| 欧美午夜精品伦理| 欧美黄色性视频| 中文字幕精品—区二区日日骚| 国产玉足脚交久久欧美| 看av免费毛片手机播放| 日本亚洲一区| 免费在线观看一区二区三区| 亚洲国产va精品久久久不卡综合| 欧美日本免费一区二区三区| 久久电影一区二区| 翔田千里亚洲一二三区| 视频一区二区三| 久久久成人av毛片免费观看| 久久国产精品久久久久久电车|