BGE 指令 ARM

BGE Instruction ARM

此测试要求在 'BGE' 条件下分支到标签。存储在我正在比较的寄存器中的值是:

LDR r0,=0X3
LDR r1,=0X8F
CMP r0,r1
BGE a_label
SUBS r1,r1, #0XC9

我预计它会分支,但不知何故 0X8F 不大于 0X3。在 Keil 上仿真我的代码证明了这一点。

我想知道是否有人知道它为什么不分支以及 0X8F 是如何被读取为大于 0X3 的!

非常感谢<3

请记住 BGE 是一个带符号的比较,因此在您的示例中它不会分支,因为第一个操作数 (r0) 不大于或等于第二个操作数 ( r1).

LDR r0,=0X3       ; load 0X00000003
LDR r1,=0X8F      ; load 0x0000008F
CMP r0,r1         ; (r0 - r1) and sets the condition register
BGE a_label       ; Conditional branch which checks if it was greater or equal (False)
SUBS r1,r1, #0XC9

为了完整起见,正如 Michael 所建议的那样,更常见(或推荐)使用 MOV r0,#0X00000003 而不是 LDR r0,=0X00000003 来加载常量(生成的文件很可能是完全一样)See this.

我认为您误解了 CMP 与条件代码的 'comparison' 变体一起工作的方式。当您阅读 CMP 后跟条件指令时,在您的脑海中,将条件代码移动到 CMP 的两个参数之间。因此

CMP r0, r1
BGE label

表示"branch if r0 is greater than or equal to r1"。在你的情况下 r0 是 3 而 r1 是 0x8F (143) 很明显分支不会发生。