2012-05-15 542 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)将根据操作结果进行更新。

问候。