撰寫簡易組語觀察 b, bl 兩指令之差異。
-
先將資料夾 gnu-mcu-eclipse-qemu 完整複製到 ESEmbedded_HW02 資料夾中
-
根據 ARM infomation center 敘述的 b, bl 用法與差異
-
op1{cond}{.W} label
op1 is one of:
B Branch.
BL Branch with link.
BLX Branch with link, and exchange instruction set.
-
The BL and BLX instructions copy the address of the next instruction into LR (R14, the link register)
-
-
設計測試程式 main.s ,從 _start 開始後依序執行 b 以及 bl 並且觀察其指令差異, 目標比較 14 行的
b label01
以及 22 行的bl sleep
執行時的變化。
main.s:
_start:
nop
//
//branch w/o link
//
b label01
label01:
nop
//
//branch w/ link
//
bl sleep
sleep:
nop
b .
- 將 main.s 編譯並以 qemu 模擬,
$ make clean
,$ make
,$ make qemu
開啟另一 Terminal 連線$ arm-none-eabi-gdb
,再輸入target remote localhost:1234
連接,輸入兩次的ctrl + x
再輸入2
, 開啟 Register 以及指令,並且輸入si
單步執行觀察。 當執行到0xa
的b.n 0xc
時,pc
跳轉至0x0c
,除了 branch 外並無變化。
當執行到 0x0e
的 bl 0x12
後,會發現 lr
更新為 0x13
。
- 使用
bl
時會儲存pc
下一行指令的位置到lr
中,通常用來進行副程式的呼叫,副程式結束要返回主程式時,可以執行bx lr
,返回進入副程式前下一行指令的位置。 - 根據 Cortex-M4-Arm Developer,由於 Cortex-M4 只支援 Thumb/ Thumb-2 指令,使用
bl
時,linker 自動把 pc 下一行指令位置並且設定 LSB 寫入lr
,未來使用bx lr
等指令時,由於lr
的 LSB 為 1 ,能確保是在 Thumb/ Thumb-2 指令下執行後續指令。 以上述程式為例,bl 0x12
下一行指令位置為 0x12 並設定 LSB 為 1 ,所以寫入 0x13 至lr
。
Linker User Guide: --entry=location
Note
If the entry address of your image is in Thumb state, then the least significant bit of the address must be set to 1.
The linker does this automatically if you specify a symbol.