2012-05-15 545 views
7

快速提問你們,在我的循環中,我需要使用CMP,BLT和BGT來比較一些值。如何在下面的循環中使用這些指令?ARM彙編器 - 如何使用CMP,BLT和BGT?

我想使用BGT,BLT和CMP,因爲我需要它們來使我的應用程序工作。麻煩的是我不知道如何使用它們。如果我想用CMP來比較r6和r4並將差異放入r7,我該怎麼做?如果我想在r7小於0時使用BLT,那麼同樣的問題,我該怎麼做?

BGT ??????? ; branch if greater than 5 
    CMP ???????? ; compare r6 with r4 , put difference into r7 
    BLT ???????? ;branch if r7 is less than 0 
    BGT ???????? ;branch if r7 is greater than 0 

這裏是我的整個循環:

LoopStart 

    BL WaitBUT1 
    BL readTemp 
    BL checkTemp 
    BGT ??????? ; branch if greater than 5 
    BL errorVal 
    CMP ???????? ; compare r6 with r4 , put difference into r7 
    BLT ???????? ;branch if r7 is less than 0 
    BL FanOn 
    BL errorLedOn 
    BL systemLedOn 
    BL heaterOn 
    BGT ???????? ;branch if r7 is greater than 0 
    BL FanOff 
    BL errorLedOff 
    BL systemLedOff 
    BL heaterOff 
    BL WaitBUT2 
    BL FanOff 
    BL errorLedOff 
    BL systemLedOff 
    BL heaterOff 

    B LoopStart 
+0

您的問題尚不清楚。請澄清。 –

+1

我已經爲我的問題添加了更多描述。 – user1080390

回答

9

如果不事先設置條件寄存器,就不能執行條件分支。這可以通過cmp或將s添加到大多數指令來完成。有關詳細信息,請查閱ARM彙編文檔。簡單的例子:

分公司如果r0大於5:

cmp r0, #5 ;Performs r0-5 and sets condition register 
bgt label_foo ;Branches to label_foo if condition register is set to GT 

比較r6r4,把差轉換r7,分支如果r7 < 0

subs r7, r6, r4 ;Performs r7 = r6 - r4 and sets condition register 
blt label_bar ;Branches to label_bar if r7 < 0 (in which case r6 < r4) 
1

如果我想使用CMP將r6與r4進行比較,並將差異放入r7,我該怎麼做?

subs r7, r6, r4 /* r7 ← r6 - r4 */ 

,如果我想用BLT如果R7是小於0的同樣的問題,我會怎麼做呢?

bmi _exit   /* branch if r7 < 0 */ 

BMI當N被啓用(負/負)(N爲1),其中N是如果該指令的結果產生負的數量將被啓用的標誌。否則禁用。

爲什麼選擇subS而不是sub?由於S是可選後綴,因此在指定時,條件標誌(如N)將根據操作結果進行更新。

問候。