哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

全面分析下BL(B)/LDR指令

FPGA之家 ? 來源:嵌入式與Linux那些事 ? 作者:嵌入式與Linux那些 ? 2021-06-01 11:15 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. BL LDR指令簡介

LDR和BL在啟動程序中,都是可以負(fù)責(zé)pc跳轉(zhuǎn)的指令。

BL是地址無關(guān)指令,即和當(dāng)前的運(yùn)行地址無關(guān)。鏈接器腳本中標(biāo)明了一個運(yùn)行地址,但是arm中的代碼實(shí)際是從地址0開始運(yùn)行的。這個時候,實(shí)際的地址和運(yùn)行地址是不符的。

如果想讓程序正常的運(yùn)行,就得使用地址無關(guān)指令。比如在完成將程序復(fù)制到內(nèi)存之前想要跳轉(zhuǎn)到一個函數(shù)里,就得使用BL。因?yàn)锽L跳轉(zhuǎn)依靠的是相對地址,和運(yùn)行地址無關(guān),所以能完成跳轉(zhuǎn)。

LDR是地址有關(guān)指令。如果這個時候使用“l(fā)dr pc,=函數(shù)名”來跳轉(zhuǎn),實(shí)際上是跳轉(zhuǎn)到這個函數(shù)在鏈接器腳本中標(biāo)明的地址上了。所以使用地址相關(guān)指令之前,要把代碼復(fù)制到鏈接器腳本中指明的那個地址上,否則的話程序就跑飛了。復(fù)制完成之后再使用LDR跳轉(zhuǎn)到內(nèi)存中,使程序繼續(xù)運(yùn)行。

2. 分析絕對跳轉(zhuǎn)過程

我們以一個例子具體分析下絕對跳轉(zhuǎn)過程。

指令1 順序執(zhí)行
指令2 順序執(zhí)行
指令3 相對跳轉(zhuǎn)到指令5
指令4 順序執(zhí)行
指令5 順序執(zhí)行
指令6 絕對跳轉(zhuǎn)到指令8
指令7 順序執(zhí)行
指令8 順序執(zhí)行
指令編號 指令功能

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

0x00000000 順序執(zhí)行 順序執(zhí)行 當(dāng)前地址+4
0x00000004 順序執(zhí)行 順序執(zhí)行 當(dāng)前地址+4
0x00000008 跳轉(zhuǎn)到指令5 跳轉(zhuǎn)到指令5 當(dāng)前地址+8
0x0000000C 順序執(zhí)行 順序執(zhí)行 當(dāng)前地址+4
0x00000010 順序執(zhí)行 順序執(zhí)行 當(dāng)前地址+4
0x00000014 跳轉(zhuǎn)到指令8 跳轉(zhuǎn)到指令8 0xC000001C
0x00000018 順序執(zhí)行 順序執(zhí)行 當(dāng)前地址+4
0x0000001C 順序執(zhí)行 順序執(zhí)行 當(dāng)前地址+4
指令地址 指令編號 指令功能 下條指令地址

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

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

因此,當(dāng)編譯地址(加載地址)和運(yùn)行地址相同時,絕對跳轉(zhuǎn)和相對跳轉(zhuǎn)都可以正確執(zhí)行。比如,程序在NORFLASH存儲時。

但是,當(dāng)編譯地址(加載地址)和運(yùn)行地址不相同時,相對跳轉(zhuǎn)就會出現(xiàn)問題。比如,代碼存儲在NANDFLASH,由于NANDFLASH并不能運(yùn)行代碼,所以需要重定位代碼到內(nèi)部的SRAM

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

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

b9332fa6-c238-11eb-9e57-12bb97331649.png

BL指令編碼格式

BL指令的[23,0]位存放的是要跳轉(zhuǎn)的相對地址,由于指令所在地址必須是4字節(jié)對齊的,因此跳轉(zhuǎn)的地址最低位必然是0。

BL指令[23,0]位保存的是省略這最低2位的地址,如果補(bǔ)全了這2位,BL指令就可以表示26位的跳轉(zhuǎn)地址。在這26位中需要使用1位表示向前跳還是向后跳,那么剩下的25位就可以表示32 MBts的范圍了,225=32M因此,B(BL)指令的跳轉(zhuǎn)范圍為-32MBytes~+32MBytes。

下圖為LDR指令的格式。

b9812512-c238-11eb-9e57-12bb97331649.png

LDR指令編碼格式

ba762f44-c238-11eb-9e57-12bb97331649.png

LDR指令編碼格式

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

4. BL執(zhí)行過程分析

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

b9332fa6-c238-11eb-9e57-12bb97331649.png

BL指令編碼格式

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

bb34f82a-c238-11eb-9e57-12bb97331649.png

條件碼

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

#ifndefCONFIG_SKIP_LOWLEVEL_INIT blcpu_init_crit #endif

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

33f000ac:eb000017bl33f0011033f00110: 33f00110:e3a00000movr0,#0;0x0 33f00114:ee070f17mcr15,0,r0,cr7,cr7,{0}

當(dāng)指令執(zhí)行到33f000ac時,對應(yīng)的機(jī)器碼為eb000017(1110_1011_0000_0000_0000_0000_0001_0111?),其中[31,28]高四位為條件碼,1110表示無條件執(zhí)行。[25,27]位保留區(qū)域,24位表示是否帶有返回值,1表示帶有返回值,也就是BL指令。[23,0]為指令的操作數(shù),0000_0000_0000_0000_0001_0111。

BL指令的跳轉(zhuǎn)地址是按照如下方式計(jì)算:

1、將指令中24位帶符號的補(bǔ)碼立即數(shù)擴(kuò)展為32位(擴(kuò)展其符號位)原數(shù)變成 0000_0000_0000_0000_0000_0000_0001_0111。

2、將此數(shù)左移兩位0000_0000_0000_0000_0000_0010_1000_0000 變成 0000_0000_0000_0000_0000_0000_0101_1100 = 0x0000005c

3、將得到的值加到PC寄存器中得到目標(biāo)地址,由于ARM為3級流水線,此時的 pc = 33f000ac+8 = 33F000B4,pc = 33F000B4 + 0x0000005c = 33F00110?與圖中的cpu_init_crit的地址相等。

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

5. LDR執(zhí)行過程分析

下圖為LDR指令的格式。

bb647adc-c238-11eb-9e57-12bb97331649.png

bb719d8e-c238-11eb-9e57-12bb97331649.png

LDR指令編碼格式

我們以下圖中的代碼作為例子分析下。

ldrpc,=call_board_init_f

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

33f000d0:e59ff324ldrpc,[pc,#804];33f003fc33f003fc:33f000d4.word0x33f000d4 ........ 33f000d4: 33f000d4:e3a00000movr0,#0;0x0

ldrpc, [pc, #804]這條指令為偽指令,編譯的時候會將call_board_init_f的鏈接地址存入一個固定的地址(鏈接時確定的),對于本條指令,這個地址就是33f000d4 。

上面的反匯編出來的 ldr pc,=call_board_init_f就變成了ldrpc, [pc, #804],由于ARM使用了流水線的原因,所以在執(zhí)行 ldr pc,[ pc, #4 ]的時候 pc 不在這句代碼這里了,而是跑到了 pc+8的地方,這句代碼相當(dāng)于 pc= *(pc+804+8)=33f000d0+32C=33f003fc ,所以會跳轉(zhuǎn)到33f003fc 地址取33f000d4 ,而33f000d4 是存在代碼段中的一個常量,并不是計(jì)算出來的,不會隨程序的位置而改變,所以無論代碼和pc怎么變 *(pc+804) 的值時不會變的。

6. 總結(jié)

這樣,絕對跳轉(zhuǎn)中的固定地址就很好理解了,要跳轉(zhuǎn)地址的值在鏈接時就已經(jīng)確定了,存在了一塊內(nèi)存中。

相對跳轉(zhuǎn)時,反匯編bl33f00110中的33f00110是根據(jù)pc計(jì)算出來的,當(dāng)pc改變時,結(jié)果也會改變。所以,稱為相對跳轉(zhuǎn),與當(dāng)前位置無關(guān)。

編輯:技巧

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    135

    文章

    9587

    瀏覽量

    393514
  • PC
    PC
    +關(guān)注

    關(guān)注

    9

    文章

    2168

    瀏覽量

    159731
  • LDR
    LDR
    +關(guān)注

    關(guān)注

    0

    文章

    101

    瀏覽量

    8300

原文標(biāo)題:分析下BL(B)/LDR指令

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    深入解析FDPF041N06BL1-F154 N溝道MOSFET:特性、應(yīng)用與性能分析

    深入解析FDPF041N06BL1-F154 N溝道MOSFET:特性、應(yīng)用與性能分析 在電子設(shè)計(jì)領(lǐng)域,MOSFET(金屬 - 氧化物 - 半導(dǎo)體場效應(yīng)晶體管)是至關(guān)重要的元件,廣泛應(yīng)用于各種電路中
    的頭像 發(fā)表于 04-15 09:55 ?363次閱讀

    SGM25711B:2.5V 至 18V 高效熱插拔控制器的全面解析

    SGM25711B:2.5V 至 18V 高效熱插拔控制器的全面解析 在電子設(shè)備的設(shè)計(jì)中,熱插拔功能至關(guān)重要,它能讓設(shè)備在帶電狀態(tài)安全地插入或拔出電路板,大大提高了系統(tǒng)的可維護(hù)性和可靠性
    的頭像 發(fā)表于 03-24 15:00 ?164次閱讀

    解析PD協(xié)議DRP角色含義及LDR6020 DRP芯片核心特性

    認(rèn)證的高性能DRP芯片,憑借高集成、強(qiáng)適配、大功率傳輸?shù)膬?yōu)勢,廣泛應(yīng)用于顯示器、擴(kuò)展塢、快充線等多類Type-C設(shè)備。本文先通俗解讀PD協(xié)議中DRP角色的核心含義,再全面介紹LDR6020 DRP芯片的特性、功能及應(yīng)用,讓技術(shù)內(nèi)容易懂且有深度。 一、PD協(xié)議中DRP角色的
    的頭像 發(fā)表于 02-09 16:53 ?1608次閱讀
    解析PD協(xié)議DRP角色含義及<b class='flag-5'>LDR</b>6020 DRP芯片核心特性

    高性能電流模式PWM控制器UC2842B/3B/4B/5B和UC3842B/3B/4B/5B全面解析

    高性能電流模式PWM控制器UC2842B/3B/4B/5B和UC3842B/3B/4
    的頭像 發(fā)表于 01-27 13:50 ?2594次閱讀

    CD4051B、CD4052B、CD4053B:高性能模擬復(fù)用器與解復(fù)用器的全面解析

    CD4051B、CD4052B、CD4053B:高性能模擬復(fù)用器與解復(fù)用器的全面解析 在電子設(shè)計(jì)的廣闊領(lǐng)域中,模擬復(fù)用器和解復(fù)用器扮演著至關(guān)重要的角色。它們能夠在多個信號源之間進(jìn)行切換
    的頭像 發(fā)表于 01-16 14:05 ?553次閱讀

    利用蜂鳥內(nèi)核來實(shí)現(xiàn)指令的仿真模擬

    介紹一RISC-V的指令架構(gòu),在RSIC-V中主要有以下6種指令格式: 因此,我們在對于一條指令進(jìn)行分析時,我們首先要知道其的
    發(fā)表于 10-24 08:17

    NucleiStudio如何生成.verilog文件和.dasm文件,以及對.dasm文件中自定義指令反匯編結(jié)果分析

    硬件設(shè)計(jì)需要.verilog文件來運(yùn)行加NICE后的tb仿真、軟件組需要.dasm來確定自定義指令有無被正確編譯。今天,我們來分享一NucleiStudio如何生成.verilog文件和.dasm
    發(fā)表于 10-24 06:33

    浮點(diǎn)數(shù)指令添加——長指令寫回仲裁

    有效并且已經(jīng)完成寫回操作,則將 oitf_ret_ena 設(shè)為 1,表示可以將 OITF 中的指令彈出。 修改方法 在修改前,保證浮點(diǎn)數(shù)指令中長指令已經(jīng)在iotf中實(shí)現(xiàn) 在輸入輸出段定義一
    發(fā)表于 10-24 06:07

    RVB 位操作指令集擴(kuò)展(一)

    一、B擴(kuò)展簡介 B擴(kuò)展,即bit-manipulation (bitmanip) extension,主打增強(qiáng)位操作的指令集。B擴(kuò)展定義了RV32-64
    發(fā)表于 10-22 08:11

    Whetstone代碼涉及的浮點(diǎn)指令匯編分析

    對benchmark中的whetstone進(jìn)行代碼分析,通過反匯編統(tǒng)計(jì)所出現(xiàn)的浮點(diǎn)指令,共有26種,如下 特點(diǎn)是只涉及單精度的浮點(diǎn)指令,并且存在有浮點(diǎn)Load/Store的壓縮指令,
    發(fā)表于 10-22 08:11

    Linux環(huán)境div指令、divu指令測試異常怎么解決?

    由于團(tuán)隊(duì)修改了muldiv指令,需要測試div指令、divu指令是否功能正常: rv32um-p-div: 意外的,程序會產(chǎn)生自檢報(bào)錯(實(shí)際上這個報(bào)錯在原工程中也會出現(xiàn)),通過info我們可以看到
    發(fā)表于 10-20 06:07

    CHB100 - 24S33:高性價(jià)比、高效替代V24B3V3T100BL

    在工業(yè)控制、通信設(shè)備等典型應(yīng)用領(lǐng)域,VICOR旗下的V24B3V3T100BL電源模塊憑借其卓越的穩(wěn)定性能贏得了市場的廣泛認(rèn)可。然而,V24B3V3T100BL較長的交貨周期(約26周)可能對項(xiàng)目
    發(fā)表于 08-04 08:42

    上海貝嶺發(fā)布RS-485接口芯片BL3085(I4B)

    針對上述應(yīng)用,上海貝嶺推出了具有超強(qiáng)ESD保護(hù)能力的RS-485接口芯片BL3085(I4B),該芯片總線端口ESD保護(hù)能力高達(dá)±30kV(IEC 61000-4-2,接觸放電),能夠更好地承受工廠生產(chǎn)和現(xiàn)場應(yīng)用中產(chǎn)生的EOS沖擊。
    的頭像 發(fā)表于 06-19 15:26 ?3056次閱讀
    上海貝嶺發(fā)布RS-485接口芯片<b class='flag-5'>BL</b>3085(I4<b class='flag-5'>B</b>)

    泰克示波器TBS2204B的FFT分析功能設(shè)置指南

    成分及諧波特性。本文將詳細(xì)介紹如何設(shè)置TBS2204B的FFT功能,結(jié)合參數(shù)配置、操作步驟及實(shí)際應(yīng)用案例,為工程師提供全面的使用指南。 ? 一、FFT分析功能概述 TBS2204B的F
    的頭像 發(fā)表于 05-16 17:45 ?1479次閱讀
    泰克示波器TBS2204<b class='flag-5'>B</b>的FFT<b class='flag-5'>分析</b>功能設(shè)置指南

    電磁環(huán)境動態(tài)監(jiān)測與分析平臺軟件全面解析

    電磁環(huán)境動態(tài)監(jiān)測與分析平臺軟件全面解析
    的頭像 發(fā)表于 04-28 16:28 ?831次閱讀
    電磁環(huán)境動態(tài)監(jiān)測與<b class='flag-5'>分析</b>平臺軟件<b class='flag-5'>全面</b>解析
    潼关县| 江门市| 仁怀市| 台湾省| 科尔| 根河市| 镇赉县| 万荣县| 常山县| 城步| 景洪市| 邹平县| 顺平县| 石阡县| 康定县| 惠东县| 康定县| 溧水县| 那曲县| 灵璧县| 仲巴县| 闸北区| 青神县| 望奎县| 潞西市| 珲春市| 桃园市| 邵阳市| 峨山| 兴仁县| 德阳市| 高邮市| 防城港市| 靖宇县| 会同县| 同心县| 长汀县| 新化县| 车致| 海门市| 比如县|