Conditional Execution | 陳丕祐
Introduction
Conditional Execution
是基於 ARM
內建的 Flags
去使用多樣化的 Branch
以實現 LOOP
的效用。
建議先看完 branch 再來看, Conditional Execution。
Usage
flags
Flags
在 ARM
是由4個變數去實現的。
N - Negative
是否為負
Z - Zero
是否為零
C - Carry
Unsighed 溢位
V - Overflow
sighed 溢位
能影響 Flag
的指令不只一個,不過在這裡只介紹CMP
。
CMP r0, r1 /*r0 - r1*/
CMP
實際上就是在內部執行 r0-r1
這個動作,並將其做為 result 給 Flags
做為其 true or false 的依據。
More Branch
多說無益,看圖。
每個 Branch
會依照上表最後一個欄位所述,由 Flag
決定是否執行。
CMP
影響 Flags
, Flags
影響 Branch
。
這就達成了 Conditional Execution
的基礎。
Example
for(int i=0; i<10; i++){
sum+=i;
}
這是一段簡單用 C
寫成的LOOP。
將其改寫為 ARM
LOOP:
ADD r1 ,r0
ADD r0 ,#1
CMP r0 ,#10
BNE LOOP
if (a > b)
a++;
這是一段簡單用 C
寫成的 if condition
。
改寫為 ARM
@if
CMP r0,r1
BMI FIN
ADD r0 , #1
FIN:
.end