###### tags: `組合語言` # 組合語言共筆 10 : Branch Instructions <br> ## 1. Branch Instructions 介紹 Branch Instructions 常被使用在 "迴圈" 和 "函數呼叫" 的功能上 主要 Instructions 有以下兩種 :::success ``` B : 將設定的目標記憶體 address 載入到 PC ( R15 ) 中, 接下來執行此 address 所在的指令,常用在 "迴圈" ``` ``` BL : 會先將原 PC 儲存的 address ( 現在指令的下一條指令位址 ) 存入 lr ( r14 ), 在將目標 address 載入 PC 中,常拿來做 "函數呼叫" 時使用 ``` - PC、LR 功能可參考 ["ARM 暫存器架構"](/CKLOEPrwRlClPJzXBRXVsA) ::: :::warning **使用語法** B{L} {<cond>} <target address> - <cond> : 是條件設定,可參考[ 條件 Execution](/4fdsMIChRQS9GoKe0M323A) ::: :::info ex1 迴圈: ```assembly= target: bne target ``` ex2 函數呼叫: ```assembly= bl func1 func: ... mov pc, lr ``` ::: <br> ## 2. 迴圈範例 簡單使用一個迴圈介紹 ` B ` 的使用方式 ### - Example 1 先說會達成的目標,是類似下列 C++ 程式 - C++ 程式 ```cpp= int i = 10; while( i != 0 ){ i = i - 1; } ``` - 組合語言方法 1 ```assembly= mov r4, #10 @ 將 10 的立即值存在 r4 loop_a: subs r4, r4, #1 @ r4 減去 #1 (10-1) 再存回 r4,並改變 CPSR 的 NZCV bne loop_a @ 用 ne 判斷 Z 是否為 0 @ 如不是 0,PC 會設為 loop_a 的 address,並執行 ``` :::success 註釋 : - ` sub ` : 為減法運算 - ` s ` : 當指令後加上 ` s ` ,表示要設定、更改 CPSR 的 [ NZCV ] 狀態值 - ` ne ` : 條件子,檢查 CPSR 的 Z 值 ( 當前值是否為 0 ( 如為 0,Z=1 ) ) ::: <br> ### - Example 2 還有另一種使用方式,再用一個類似的例子解釋 - C++ 程式 ```cpp= int i = 0; while( i != 10 ){ i = i + 1; } ``` - 組合語言方法 此方法是不使用 `s` 修飾詞 ```assembly= mov r4, #0 loop_a: add r0, r0, #1 @ r0=r0+1 cmp r0, #10 @ 比較 r0 是否等於 10,如相等 CPSR 的 Z=1 bne loop_a ``` <br> ## 3. Subroutines 呼叫函數範例 利用 BL 特性可以實踐呼叫函數的方法 ex : ```assembly= func1: bl func2 @ 將下一行指令存入 lr(r14),並把 func2 存入 PC 執行 func2: ... @ 其他函數功能... mov pc, lr @ 將之前儲存在 lr 的位址存入 PC,也就是 return @ 並執行原 bl 的下一條指令 ``` 概念為下圖  <br>
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up