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) 很明显分支不会发生。
此测试要求在 '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) 很明显分支不会发生。