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

2021-09-06 22:22:26 字數 2152 閱讀 3531

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

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

將指令中24位帶符號的補碼立即數擴充套件為32(擴充套件其符號位);將此32位數左移兩位;將得到的值加到pc暫存器中,即得到跳轉的目標位址。

例程:1.text

2.global   _start

3_start:

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完全開發流程》的一點總結...

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

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 300000...

使用NRF52xx sniffer抓取BLE包

抓取ble資料報就和我們做程式開發中列印log功能是一樣的,我們可以方便快捷的獲取程式執行狀態以及出錯後定位bug位置,無線通訊過程中的資料報都是通過電磁波以空氣為介質進行傳播的。所以,我們抓取空氣中的資料報,對ble開發來說,完全是0感知,不會有傳統程式開發過程中log列印的太多影響程式的執行效率...

Mysql 索引(B樹或B 樹)

參考1 參考2myisam索引與innodb索引相比較 myisam支援全文索引 fulltext 壓縮索引,innodb不支援 innodb支援事務,myisam不支援 myisam順序儲存資料,索引葉子節點儲存對應資料行位址,輔助索引很主鍵索引相差無幾 innodb主鍵節點同時儲存資料行,其他輔...