使用B或BL跳轉時,下一條指令的地址是這樣計算的

B跳轉指令:它是個相對跳轉指令,其機器碼格式以下:學習

[31:28]位是條件碼[27:24]位爲「1010」0xeaffffff,表示B跳轉指令,爲「1011」時,表示BL跳轉指令;[23:0]表示偏移地址。spa

使用B或BL跳轉時,下一條指令的地址是這樣計算的:開發

將指令中24位帶符號的補碼當即數擴展爲32(擴展其符號位);將此32位數左移兩位;將獲得的值加到pc寄存器中,即獲得跳轉的目標地址。擴展

例程:二進制

1.text開發流程

2.global   _start總結

3_start:tar

4         b step1

5 step1:

6         ldr pc,  =step2

7 step2:

8         b step2

 

反彙編代碼:

0:  eaffffff     b   0x4

 

 

 

4:  e59ff000   ldr pc, [pc, #0] ; 0xc

8:  eafffffe     b   0x8

c:  30000008  tsteq r0, #8  ; 0x8

 

b跳轉指令:它是個相對跳轉指令,其機器碼格式以下:

 

[31:28]位是條件碼[27:24]位爲「1010」0xeaffffff爲一條指令的二進制機器碼,表示B跳轉指令,爲「1011」時,表示BL跳轉指令;[23:0]表示一個相對於PC的偏移地址。

    將指令中24位帶符號的補碼當即數擴展爲32(擴展其符號位);將此32位數左移兩位;將獲得的值加到pc寄存器中,即獲得跳轉的目標地址。

咱們看看第一條指令「b step1」的機器碼0xeaffffff:

1.24位帶符號的補碼爲0xffffff,將它擴展爲32獲得:0xffffffff

2.將此32位數左移兩位獲得:0xfffffffc,其值就是-4(0xfffffffc符號位不變,其他位取反再加1獲得-4);

3.pc的值是當前指令的下兩條(下一條的下一條指令的地址,加上步驟2獲得的-4(PC-4,即PC回退4個字節,恰好指向當前指令的下一條指令上),這剛好是第二條指令step1的地址。

    不要被被反彙編代碼中的「b 0x4」給迷惑了,它可不是說跳到絕對地址0x4處執行,絕對地址得像上述3個步驟那樣計算。

 

學習《S3C2410徹底開發流程》的一點總結...

相關文章
相關標籤/搜索