我对装配很新,现在我想了解cmp
的工作原理。以下是wiki中的内容:
cmp arg2, arg1
在arg1和arg2之间执行比较操作。比较 通过从arg1(结果)中减去arg2的(带符号)来执行 其中可以称为Temp。 然后丢弃温度。
这是什么意思“Temp然后被丢弃”?它存放在哪里?如何访问此比较结果?有人可以解释一下吗?
答案 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 示例2:如果AX> BX MOV AX,8 MOV BX,5 CMP AX,BX 示例3:如果AX = BX MOV AX,8 MOV BX,5 CMP AX,BX 我希望您了解CMP的结果正在改变ZF和CF的值
ZF =零标志
CF =进位标志结果:ZF和CF设置为==>“ ZF = 0”和“ CF = 1”
结果:ZF和CF设置为==>“ ZF = 0”和“ CF = 0”
结果:ZF和CF设置为==>“ ZF = 1”和“ CF = 0”
答案 2 :(得分:3)
在关心arg1和arg 2是否相等时,我们使用cmp arg2, arg1
。处理器通过从arg1中减去arg2来确定,然后查看结果。如果结果为零(即arg1 = arg2),则处理器将零标志设置为零(通过“设置标志”,我们意味着将其设置为1)。相反,如果结果不为零(即arg1!= arg2),则处理器清除零标志(即将其设置为0)。结果本身将被丢弃,因为我们不在乎它是什么,只关心它是否为零,而现在我们根据是否设置了零标志来知道结果。然后,我们可以使用JE
,JNE
,JZ
和JNZ
之类的指令来检查零标志并根据其值跳转(或不跳转)。在JE
的情况下(如果相等,则跳转),如果设置了零标志,则将发生跳转,而(如上所述)则cmp
中的参数相等。 / p>
答案 3 :(得分:1)
我认为发布有关该问题的答案为时已晚。但是我可以为您更好地说明此CMP指令的工作原理。
使用CMP arg1, arg2
CMP指令根据参数之间的比较设置状态标志。 参见:wikipedia's FLAGS page
CMP的重要性主要适用于条件代码执行(跳转-参见:assembly_conditions)。当处理器执行条件跳转jcc
指令时,它会检查状态标志寄存器,并在满足条件时跳转到目标标签,否则跳转到下一条指令。