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次方 ...