精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

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

FPGA之家 ? 來源:FPGA之家 ? 作者:FPGA之家 ? 2022-07-03 10:29 ? 次閱讀

1. BL LDR指令簡介

2. 分析絕對跳轉過程

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

4. BL執行過程分析

5. LDR執行過程分析

6. 總結

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

9af2867a-f99d-11ec-ba43-dac502259ad0.png絕對跳轉分析

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

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

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

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

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

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

9b145336-f99d-11ec-ba43-dac502259ad0.pngBL指令編碼格式

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

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

??下圖為LDR指令的格式。

9b45f3be-f99d-11ec-ba43-dac502259ad0.pngLDR指令編碼格式 9b7853fe-f99d-11ec-ba43-dac502259ad0.pngLDR指令編碼格式

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

4. BL執行過程分析

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

9b145336-f99d-11ec-ba43-dac502259ad0.pngBL指令編碼格式

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

9bca6ff4-f99d-11ec-ba43-dac502259ad0.png條件碼

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

#ifndefCONFIG_SKIP_LOWLEVEL_INIT
blcpu_init_crit
#endif

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

33f000ac:eb000017bl33f00110
33f00110:
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指令的格式。9bee8e34-f99d-11ec-ba43-dac502259ad0.png

9c0662fc-f99d-11ec-ba43-dac502259ad0.pngLDR指令編碼格式

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

ldrpc,=call_board_init_f

??對應的反匯編代碼如下:

33f000d0:e59ff324ldrpc,[pc,#804];33f003fc
33f003fc: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改變時,結果也會改變。所以,稱為相對跳轉,與當前位置無關。

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

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

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

    關注

    31

    文章

    5250

    瀏覽量

    119179
  • 函數
    +關注

    關注

    3

    文章

    4233

    瀏覽量

    61961
  • 代碼
    +關注

    關注

    30

    文章

    4668

    瀏覽量

    67752

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

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

收藏 人收藏

    評論

    相關推薦

    【NanoPi M2試用體驗】+SD卡啟動BL1拷貝BL2到DDR2中運行

    */bl ddr_init/* DDR初始化 */bl main/* 跳轉到C函數去執行 */ldr sp, =0x34000000/* 重新設在棧為DDR內存的最高地址 */
    發表于 06-11 17:03

    ARM匯編指令(B/BL/BX)--轉載

    向后的 32MB 的地址空間的跳轉,包括以下 4 條指令:(1) B 跳轉指令(2) BL 帶返回的跳轉指令(3) BLX 帶返回和狀態切換
    發表于 01-26 16:26

    ARM2440的啟動模式

    程序。代碼Head.s.extern main.text.global _start_start: b resetreset: ldr sp,=4096 bl disable_watch_dog
    發表于 07-05 05:29

    使用bl指令設置系統時鐘不能正常運行

    *1024 //設置時鐘 //bl Init_system_clock //執行main bl mainhalt: b haltCLOSE_WATCHDOG_S: //關閉看門狗 ldr
    發表于 03-05 03:09

    請問ldr pc, und_addr跳轉是絕對地址還是相對地址?

    位置\014_und_exception_014_004\002start.S輸出的錯誤信息:ldr pc, und_addr這一句為什么不是ldr pc, =und_addr ,ldr pc, und_addr
    發表于 04-16 07:45

    單板匯編代碼報錯

    to fit: R_ARM_PC24 main原因是b跳轉范圍不夠,但是在前一句 ldr pc, =on_sdram ,這個時候pc已經跳轉
    發表于 04-24 05:48

    arm匯編跳轉指令總結

    目前所知道的跳轉指令有 b,bl,bep,bne.他們共同點是都是以b開頭,首先從字面上分析:b:是Branch,表示分支。
    發表于 04-26 02:39

    ARM處理器中斷響應為什么非要跳轉兩次?

    最近看uboot源碼中S3C2440的start.S,源碼的開始部分就是如下的代碼:.globl _start_start: b reset ldr pc
    發表于 08-15 03:47

    請問一下ARM跳轉指令的范圍是多少

    (帶連接的跳轉指令)能夠在跳轉時對當前 PC 值自動進行保存。Thumb的B系列指令跳轉范圍只有256字節,然而大多數情況下
    發表于 04-14 09:30

    請問一下ARM匯編中的B跳轉指令和LDR跳轉的區別在哪

    請問一下ARM匯編中的B跳轉指令和LDR跳轉的區別有哪些不同之處呢?
    發表于 07-21 15:57

    SPC58NG84E7引導加載程序,BL不會跳轉到APP并繼續運行BL代碼是什么問題?

    我正在研究 SPC58NG84E7 引導加載程序。我有 BL 代碼(在 0xFC0000),它在啟動后等待 10 秒后跳轉到 APP 位置 0xFD0000 并在那里執行代碼。兩個代碼都有優化
    發表于 12-15 07:40

    跳轉指令B及帶連接的跳轉指令BLX上 

    跳轉B)和跳轉連接(BL)指令是改變指令執行順序的標準方式。ARM一般按照字地址順序執行指令,需要時使用條件執行跳過某段指令。只要程序必須偏離順序執行,就要使用控制流指令來修改程序計
    發表于 10-19 10:26 ?2次下載
    <b class='flag-5'>跳轉</b>指令<b class='flag-5'>B</b>及帶連接的<b class='flag-5'>跳轉</b>指令BLX上 

    ARM嵌入式系統的中斷服務例程跳轉

    在32位 ARM 系統中,一般都是在中斷向量表中放置一條分支指令或PC寄存器加載指令,實現 程序跳轉 到 中斷服務 例程的功能。例如: IRQEntry B HandleIRQ ;跳轉范圍
    發表于 04-10 10:11 ?2774次閱讀

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

    1. BL LDR指令簡介 LDRBL在啟動程序中,都是可以負責pc跳轉的指令。 BL是地址無
    的頭像 發表于 06-01 11:15 ?6925次閱讀
    全面分析下<b class='flag-5'>BL</b>(<b class='flag-5'>B</b>)/<b class='flag-5'>LDR</b>指令

    ATF中bl2到bl31的跳轉介紹

    bl2到bl31的跳轉bl2_main函數中最終會調用smc(BL1_SMC_RUN_IMAGE,(unsigned long)next
    的頭像 發表于 11-07 16:09 ?712次閱讀