了解cmp指令

时间:2017-08-26 18:22:22

标签: assembly x86 comparison

我对装配很新,现在我想了解cmp的工作原理。以下是wiki中的内容:

cmp arg2, arg1
  

在arg1和arg2之间执行比较操作。比较   通过从arg1(结果)中减去arg2的(带符号)来执行   其中可以称为Temp。 然后丢弃温度

这是什么意思“Temp然后被丢弃”?它存放在哪里?如何访问此比较结果?有人可以解释一下吗?

4 个答案:

答案 0 :(得分:7)

cmp arg2, arg1执行与sub arg2, arg1 相同的操作,除了,没有修改任何操作数。差异不会存储在任何地方

然而,标志寄存器更新的,可以在条件跳转中使用,例如jump-if-equal(JE),通常作为{{之后的下一条指令1}}。

优于其他指令的优点是您可以比较两个值而不会破坏它们中的任何一个。如果你做cmp并且它们恰好相同,那么其中一个之后就会为零。 sub arg2, arg1他们都在那里。

答案 1 :(得分:4)

CMP的结果是改变ZF和CF的值,这是一些非常了解CMP指令的示例。

示例1:如果AX

MOV AX,5

MOV BX,8

CMP AX,BX

结果:ZF和CF设置为==>“ ZF = 0”和“ CF = 1”


示例2:如果AX> BX

MOV AX,8

MOV BX,5

CMP AX,BX

结果:ZF和CF设置为==>“ ZF = 0”和“ CF = 0”


示例3:如果AX = BX

MOV AX,8

MOV BX,5

CMP AX,BX

结果:ZF和CF设置为==>“ ZF = 1”和“ CF = 0”


我希望您了解CMP的结果正在改变ZF和CF的值 ZF =零标志 CF =进位标志

答案 2 :(得分:3)

在关心arg1和arg 2是否相等时,我们使用cmp arg2, arg1。处理器通过从arg1中减去arg2来确定,然后查看结果。如果结果为零(即arg1 = arg2),则处理器将零标志设置为零(通过“设置标志”,我们意味着将其设置为1)。相反,如果结果不为零(即arg1!= arg2),则处理器清除零标志(即将其设置为0)。结果本身将被丢弃,因为我们不在乎它是什么,只关心它是否为零,而现在我们根据是否设置了零标志来知道结果。然后,我们可以使用JEJNEJZJNZ之类的指令来检查零标志并根据其值跳转(或不跳转)。在JE的情况下(如果相等,则跳转),如果设置了零标志,则将发生跳转,而(如上所述)则cmp中的参数相等。 / p>

答案 3 :(得分:1)

我认为发布有关该问题的答案为时已晚。但是我可以为您更好地说明此CMP指令的工作原理。

使用CMP arg1, arg2

比较两个参数时

CMP指令根据参数之间的比较设置状态标志。 参见:wikipedia's FLAGS page

CMP的重要性主要适用于条件代码执行(跳转-参见:assembly_conditions)。当处理器执行条件跳转jcc指令时,它会检查状态标志寄存器,并在满足条件时跳转到目标标签,否则跳转到下一条指令。