国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

1. BL LDR指令簡介

LDR和BL在啟動程序中,都是可以負責pc跳轉的指令。

BL是地址無關指令,即和當前的運行地址無關。鏈接器腳本中標明了一個運行地址,但是arm中的代碼實際是從地址0開始運行的。這個時候,實際的地址和運行地址是不符的。

如果想讓程序正常的運行,就得使用地址無關指令。比如在完成將程序復制到內存之前想要跳轉到一個函數里,就得使用BL。因為BL跳轉依靠的是相對地址,和運行地址無關,所以能完成跳轉。

LDR是地址有關指令。如果這個時候使用“ldr pc,=函數名”來跳轉,實際上是跳轉到這個函數在鏈接器腳本中標明的地址上了。所以使用地址相關指令之前,要把代碼復制到鏈接器腳本中指明的那個地址上,否則的話程序就跑飛了。復制完成之后再使用LDR跳轉到內存中,使程序繼續運行。

2. 分析絕對跳轉過程

我們以一個例子具體分析下絕對跳轉過程。

指令1 順序執行
指令2 順序執行
指令3 相對跳轉到指令5
指令4 順序執行
指令5 順序執行
指令6 絕對跳轉到指令8
指令7 順序執行
指令8 順序執行
指令編號 指令功能

假設程序被放在0x00000000位置開始執行,編譯鏈接后的結果為:

0x00000000 順序執行 順序執行 當前地址+4
0x00000004 順序執行 順序執行 當前地址+4
0x00000008 跳轉到指令5 跳轉到指令5 當前地址+8
0x0000000C 順序執行 順序執行 當前地址+4
0x00000010 順序執行 順序執行 當前地址+4
0x00000014 跳轉到指令8 跳轉到指令8 0xC000001C
0x00000018 順序執行 順序執行 當前地址+4
0x0000001C 順序執行 順序執行 當前地址+4
指令地址 指令編號 指令功能 下條指令地址

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

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

因此,當編譯地址(加載地址)和運行地址相同時,絕對跳轉和相對跳轉都可以正確執行。比如,程序在NORFLASH存儲時。

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

3. BL(B)和LDR跳轉范圍是如何規定的

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

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

BL指令編碼格式

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

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

下圖為LDR指令的格式。

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

LDR指令編碼格式

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

LDR指令編碼格式

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

4. BL執行過程分析

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

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

BL指令編碼格式

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

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

條件碼

我們以Uboot啟動過程中的這句跳轉代碼分析下BL指令具體的執行過程。

#ifndefCONFIG_SKIP_LOWLEVEL_INIT blcpu_init_crit #endif

上述代碼對應的反匯編代碼如下:

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

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

BL指令的跳轉地址是按照如下方式計算:

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

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

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

在算的過程中我們使用的始終是PC的值,假設程序在 0 地址處執行,那么計算方法一樣,pc 的值變了,計算出來的結果也隨之改變。所以 BL 的跳轉時是與位置無關的。

5. LDR執行過程分析

下圖為LDR指令的格式。

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

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

LDR指令編碼格式

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

ldrpc,=call_board_init_f

對應的反匯編代碼如下:

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使用了流水線的原因,所以在執行 ldr pc,[ pc, #4 ]的時候 pc 不在這句代碼這里了,而是跑到了 pc+8的地方,這句代碼相當于 pc= *(pc+804+8)=33f000d0+32C=33f003fc ,所以會跳轉到33f003fc 地址取33f000d4 ,而33f000d4 是存在代碼段中的一個常量,并不是計算出來的,不會隨程序的位置而改變,所以無論代碼和pc怎么變 *(pc+804) 的值時不會變的。

6. 總結

這樣,絕對跳轉中的固定地址就很好理解了,要跳轉地址的值在鏈接時就已經確定了,存在了一塊內存中。

相對跳轉時,反匯編bl33f00110中的33f00110是根據pc計算出來的,當pc改變時,結果也會改變。所以,稱為相對跳轉,與當前位置無關。

編輯:技巧

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • ARM
    ARM
    +關注

    關注

    135

    文章

    9553

    瀏覽量

    391871
  • PC
    PC
    +關注

    關注

    9

    文章

    2167

    瀏覽量

    159321
  • LDR
    LDR
    +關注

    關注

    0

    文章

    100

    瀏覽量

    8257

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

    認證的高性能DRP芯片,憑借高集成、強適配、大功率傳輸的優勢,廣泛應用于顯示器、擴展塢、快充線等多類Type-C設備。本文先通俗解讀PD協議中DRP角色的核心含義,再全面介紹LDR6020 DRP芯片的特性、功能及應用,讓技術內容易懂且有深度。 一、PD協議中DRP角色的
    的頭像 發表于 02-09 16:53 ?907次閱讀
    解析PD協議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
    的頭像 發表于 01-27 13:50 ?1172次閱讀

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

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

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

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

    Whetstone代碼涉及的浮點指令匯編分析

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

    Linux環境div指令、divu指令測試異常怎么解決?

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

    CHB100 - 24S33:高性價比、高效替代V24B3V3T100BL

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

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

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

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

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

    電磁環境動態監測與分析平臺軟件全面解析

    電磁環境動態監測與分析平臺軟件全面解析
    的頭像 發表于 04-28 16:28 ?706次閱讀
    電磁環境動態監測與<b class='flag-5'>分析</b>平臺軟件<b class='flag-5'>全面</b>解析

    CPU的各種指令和執行流程

    、數據傳輸等功能。要深入理解CPU的指令,我們需要從多個維度進行分析,尤其是指令的構成、分類、執行流程以及與不同架構的關系。
    的頭像 發表于 04-18 11:24 ?2624次閱讀

    Keysight N5245B PNA-X 微波網絡分析

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

    全面分析運算放大器和電壓比較器的區別

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

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

    涵蓋? LDR6023BLDR6023M、LDR6023C、LDR6025、LDR6290 ?等核心產品,幫助開發者及用戶快速理解其技術特
    的頭像 發表于 03-10 11:50 ?1485次閱讀

    樂得瑞LDR6282:雙C口DRP及USB PD3.0控制芯片

    樂得瑞LDR6282:雙C口DRP及USB PD3.0控制芯片
    的頭像 發表于 03-06 15:51 ?1489次閱讀