91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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)明了一個(gè)運(yùn)行地址,但是arm中的代碼實(shí)際是從地址0開始運(yùn)行的。這個(gè)時(shí)候,實(shí)際的地址和運(yùn)行地址是不符的。

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

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

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

我們以一個(gè)例子具體分析下絕對跳轉(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空間(如右圖)時(shí),開始執(zhí)行指令1,然后采用相對尋址的方法就可以運(yùn)行到指令6,在指令6執(zhí)行時(shí)也可以使用絕對尋址的方法從0xC0000014正確跳轉(zhuǎn)到指令8所在的0xC00001C位置,這段代碼運(yùn)行正常。

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

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

但是,當(dāng)編譯地址(加載地址)和運(yùn)行地址不相同時(shí),相對跳轉(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)成第二個(gè)操作數(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時(shí),對應(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級流水線,此時(shí)的 pc = 33f000ac+8 = 33F000B4,pc = 33F000B4 + 0x0000005c = 33F00110?與圖中的cpu_init_crit的地址相等。

在算的過程中我們使用的始終是PC的值,假設(shè)程序在 0 地址處執(zhí)行,那么計(jì)算方法一樣,pc 的值變了,計(jì)算出來的結(jié)果也隨之改變。所以 BL 的跳轉(zhuǎn)時(shí)是與位置無關(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]這條指令為偽指令,編譯的時(shí)候會將call_board_init_f的鏈接地址存入一個(gè)固定的地址(鏈接時(shí)確定的),對于本條指令,這個(gè)地址就是33f000d4 。

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

6. 總結(jié)

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

相對跳轉(zhuǎn)時(shí),反匯編bl33f00110中的33f00110是根據(jù)pc計(jì)算出來的,當(dāng)pc改變時(shí),結(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

    文章

    9553

    瀏覽量

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

    關(guān)注

    9

    文章

    2167

    瀏覽量

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

    關(guān)注

    0

    文章

    100

    瀏覽量

    8257

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

    解析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 ?931次閱讀
    解析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 ?1185次閱讀

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

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

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

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

    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)錯(cuò)(實(shí)際上這個(gè)報(bào)錯(cuò)在原工程中也會出現(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 ?2807次閱讀
    上海貝嶺發(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 ?1283次閱讀
    泰克示波器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 ?715次閱讀
    電磁環(huán)境動態(tài)監(jiān)測與<b class='flag-5'>分析</b>平臺軟件<b class='flag-5'>全面</b>解析

    CPU的各種指令和執(zhí)行流程

    、數(shù)據(jù)傳輸?shù)裙δ?。要深入理解CPU的指令,我們需要從多個(gè)維度進(jìn)行分析,尤其是指令的構(gòu)成、分類、執(zhí)行流程以及與不同架構(gòu)的關(guān)系。
    的頭像 發(fā)表于 04-18 11:24 ?2639次閱讀

    Keysight N5245B PNA-X 微波網(wǎng)絡(luò)分析

    研發(fā)、生產(chǎn)還是驗(yàn)證階段,都能輕松應(yīng)對! N5245B PNA-X 網(wǎng)絡(luò)分析儀不僅僅是一款矢量網(wǎng)絡(luò)分析儀,在測量放大器、混頻器和變頻器等有源器件方面,它們也是功能全面和靈活的微波測試引擎
    的頭像 發(fā)表于 04-08 18:14 ?830次閱讀
    Keysight N5245<b class='flag-5'>B</b> PNA-X 微波網(wǎng)絡(luò)<b class='flag-5'>分析</b>儀

    全面分析運(yùn)算放大器和電壓比較器的區(qū)別

    全面分析運(yùn)算放大器和電壓比較器的區(qū)別運(yùn)算放大器和比較器無論外觀或圖紙符號都差不多,那么它們究竟有什么區(qū)別,在實(shí)際維修中如何區(qū)分?今天我來圖文全面分析
    發(fā)表于 03-17 15:11

    樂得瑞(Legendary)PD協(xié)議芯片系列中多款型號的功能區(qū)別及應(yīng)用場景的匯總分析

    涵蓋? LDR6023B、LDR6023M、LDR6023C、LDR6025、LDR6290 ?等核心產(chǎn)品,幫助開發(fā)者及用戶快速理解其技術(shù)特
    的頭像 發(fā)表于 03-10 11:50 ?1500次閱讀