回覆列表
  • 1 # 使用者5864434485065

    B和BL指令都是相對跳轉指令,反彙編雖然給出了“b 33f80050”,但實際上,執行的機器指令為“ea000012 ”,反彙編程式將“ea000012 ”與當前預定的PC的值相結合,計算得出“b 33f80050”。

    [31:28]位是條件碼;[27:24]位為“1010”時,表示B跳轉指令,為“1011”時,表示BL跳轉指令;[23:0]表示偏移地址。正確的跳轉地址為:

    (1)偏移地址擴充套件為32位數:機器指令“ea000012 ”中表示跳轉位置的為:0x000012,將其擴充套件為32位數,為0x00000012;

    (2)將該32位數左移兩位,得到真正的基於PC的偏移地址:0x00000012--->0x00000048;

    (3)將該偏移地址與當前PC的值相加,得到真正的跳轉地址:反彙編程式以ELF格式的檔案為輸入,該檔案中記錄了連結指令碼中設定的起始地址(預設為0),由於ELF格式中關於該跳轉指令的資訊只有“ea000012”,不存在像“start_code”這樣的標號(連結後丟棄掉了),反彙編程式在執行反彙編過程的時候,只能根據預定的起始地址計算出當前的PC,加上基於PC的偏移地址得到“b 33f80050”,在題主給出的例子中,當前正在執行的指令以預定起始地址為基準的位置為33f80000,而arm為三級流水線構架,所以PC=33f80000+8,所以跳轉地址為33f80000+8+00000048=33F80050,和“b 33f80050”一致。

    總結來說:B和BL指令確實是以當前PC為基準進行的相對跳轉,反彙編得到的跳轉地址是基於ELF檔案中保留的資訊計算出來的地址,而並非執行時真正的跳轉地址,當執行起始地址和連結指令碼設定的起始地址一致時,兩者相等。

    也就是說,忘記反彙編出來的那條跳轉指令吧。

  • 中秋節和大豐收的關聯?
  • 實在不明白,有些女歌手唱民歌,非要用美聲唱法,是怎麼個意思?