Conditional Execution | 陳丕祐

Introduction

Conditional Execution 是基於 ARM 內建的 Flags 去使用多樣化的 Branch 以實現 LOOP 的效用。

建議先看完 branch 再來看, Conditional Execution。

Usage

flags

FlagsARM 是由4個變數去實現的。

  • N - Negative

    是否為負

  • Z - Zero

    是否為零

  • C - Carry

    Unsighed 溢位

  • V - Overflow

    sighed 溢位

能影響 Flag 的指令不只一個,不過在這裡只介紹CMP

CMP r0, r1 /*r0 - r1*/

CMP 實際上就是在內部執行 r0-r1 這個動作,並將其做為 resultFlags 做為其 true or false 的依據。

More Branch

多說無益,看圖。

branch

每個 Branch 會依照上表最後一個欄位所述,由 Flag 決定是否執行。

CMP 影響 FlagsFlags 影響 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

參考資料

Introduction to ARM: Conditional Execution