快速提问你们,在我的循环中,我需要使用CMP,BLT和BGT来比较一些值。如何在以下循环中使用所述说明?
我正在尝试使用BGT,BLT和CMP,因为我需要它们来使我的应用程序正常工作。麻烦的是我不知道如何使用它们。如果我想用CMP比较r6,用r4并将差异放到r7中,我该怎么做?同样的问题,如果我想使用BLT,如果r7小于0,我该怎么做?
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 :(得分: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
将r6
与r4
进行比较,将差异加入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 :(得分: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是可选的后缀,指定when时,条件标志(如N)会根据操作结果进行更新。
问候。
答案 2 :(得分:0)
您应该查看ARM文档(CMP文档的示例): http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/CIHIDDID.html
从那里可以阅读的内容可能需要两个指令而不是一个指令(除非你的ARM汇编程序做了一些特殊处理)
亲切的问候,
博