ARM中的汇编如何使用比较助记符?

时间:2017-08-13 02:54:08

标签: assembly arm

在下面的代码中,当我使用./filename ; echo $?编译并执行它时,我得到4。为什么呢?

.global _start

_start:

    mov R1,#1
    mov R2,#2
    cmp R1,R2
    BGT bigger

bigger:

    mov R0,#4
    B end

_default:

    mov R0,#3

end:

    mov R7,#1
    swi 0

1 个答案:

答案 0 :(得分:1)

由于您正在编写汇编语言,因此您已经拥有像ARM架构参考手册(ARM ARM)那样的指令集引用,对吗?当您在CMP指令的操作下阅读该手册时,您发现:

if ConditionPassed(cond) then
alu_out = Rn - shifter_operand
N Flag = alu_out[31]
Z Flag = if alu_out == 0 then 1 else 0
C Flag = NOT BorrowFrom(Rn - shifter_operand)
V Flag = OverflowFrom(Rn - shifter_operand)

然后在分支指令下

if ConditionPassed(cond) then
if L == 1 then
LR = address of the instruction after the branch instruction
PC = PC + (SignExtend(signed_immed_24) << 2)

并且cond字段描述了执行或不执行指令所需的条件

1100 GT Signed greater than Z clear, and either N set and V set, or
N clear and V clear (Z == 0,N == V)

1110 AL Always (unconditional)

如果未指定其他条件,则暗示AL。

当您阅读本手册时,您不明白这部分内容是什么?