8

给你们一个快速的问题,在我的循环中,我需要使用 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
4

3 回答 3

11

如果不首先以某种方式设置条件寄存器,就无法进行条件分支。这可以通过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,分支 if 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)
于 2012-05-15T13:32:53.073 回答
1

如果我想使用 CMP 比较 r6 和 r4 并将差异放入 r7,我该怎么做?

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

同样的问题,如果我想在 r7 小于 0 时使用 BLT,我该怎么做?

bmi _exit          /* branch if r7 < 0 */

BMI(减号/负号) 当 N 被启用时(N 为 1),其中 N 是一个标志,如果指令的结果产生一个负数,则该标志将被启用。否则禁用。

为什么是 subS 而不是 sub?因为 S 是指定时的可选后缀,所以条件标志(如 N)会根据操作结果更新。

问候。

于 2017-01-04T11:14:55.597 回答
0

您应该查看 ARM 文档(CMP 文档示例): http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/ CIHIDDID.html

从那里可以读到的内容,您尝试执行的操作可能需要两条指令,而不仅仅是一条指令(除非您的 ARM 汇编器进行一些特殊处理)

亲切的问候,

于 2012-05-15T13:15:34.203 回答