B或BL跳轉時位址的計算方法

2021-06-22 17:18:53 字數 997 閱讀 2359

1

.text

2.global

_start

3_start:

4b step1

5step1:

6 ldr pc, =step2

7step2:

8b 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的偏移位址。

1>將指令中24位帶符號的補碼立即數擴充套件為32(擴充套件其符號位);

2>將此32位數左移兩位;

3>將得到的值加到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個步驟那樣計算。

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

b跳轉指令 它是個相對跳轉指令,其機器碼格式如下 31 28 位是條件碼 27 24 位為 1010 0xeaffffff 時,表示b跳轉指令,為 1011 時,表示bl跳轉指令 23 0 表示偏移位址。將指令中24位帶符號的補碼立即數擴充套件為32 擴充套件其符號位 將此32位數左移兩位 將得到的...

記憶體位址的計算方法

記憶體位址的計算方法 記憶體是按位元組編址的,所以單位是位元組哈,1位元組可是等於8位的。因為計算的範圍一般比較小,所以就記住兩個就夠了。記住幾個常用的2的10次方為1024即1kb 2的20次方 2的10次方 的平方,即1mb就行了 如果要求更大的,那就再記住2的40次方 2的10次方 的4次方 ...

記憶體位址的計算方法

記憶體位址的計算方法 記憶體是按位元組編址的,所以單位是位元組哈,1位元組可是等於8位的。因為計算的範圍一般比較小,所以就記住兩個就夠了。記住幾個常用的2的10次方為1024即1kb 2的20次方 2的10次方 的平方,即1mb就行了 如果要求更大的,那就再記住2的40次方 2的10次方 的4次方 ...