我对组装非常陌生,现在我正在努力了解cmp是如何工作的。下面是用https://en.wikibooks.org/wiki/X86_Assembly/Control_Flow#Comparison_Instructions编写的
cmp arg2, arg1执行arg1和arg2之间的比较操作。比较是通过(签名)从arg2中减去arg1来执行的,其结果可以称为Temp。然后丢弃临时。
“然后放弃临时”是什么意思?它存放在哪里?如何访问比较的结果?有人能解释一下吗?
发布于 2017-08-26 19:14:59
cmp arg2, arg1执行与sub arg2, arg1相同的操作,只是没有修改操作数。差别没有存储在任何地方。
但是,标志寄存器是更新的,可以在条件跳转中使用,比如跳转(JE),通常作为cmp之后的下一个指令。
与其他指令相比,它的优点是您可以比较两个值而不破坏其中的任何一个。如果你做了sub arg2, arg1,它们恰好是相等的,那么它们中的一个就等于零了。有了cmp,他们都还在那里。
发布于 2020-05-03 00:41:28
CMP的结果改变了ZF和CF的值,这是理解CMP指令的一些例子。
示例1: if AX < BX
MOV AX,5
MOV BX,8
CMP AX,BX 结果: ZF和CF设置为==> "ZF = 0“和"CF = 1”
示例2: if > BX
MOV AX,8
MOV BX,5
CMP AX,BX结果: ZF和CF设置为==> "ZF = 0“和"CF = 0”
示例3: if = BX
MOV AX,5
MOV BX,AX
CMP AX,BX 结果: ZF和CF设置为==> "ZF = 1“和"CF = 0”
我希望您了解CMP的结果正在改变ZF和CF的值。
ZF =零旗
CF =带旗
发布于 2018-08-24 15:48:27
当我们关心cmp arg2, arg1和arg 2是否相等时,我们使用arg1。处理器通过从arg2中减去arg1来确定这一点,然后查看结果。如果结果为零(即arg1 = arg2),则处理器设置零标志(“设置标志”,我们的意思是将其设置为1)。相反,如果结果不是零(即arg1 != arg2),则处理器清除零标志(即将其设置为0)。结果本身被丢弃了,因为我们不关心它是什么,只关心它是否是零,这是我们现在根据是否设置了零标志而知道的。然后,我们可以使用像JE、JNE、JZ和JNZ这样的指令来检查零标志,并根据它的值跳转(或不跳)。在JE的情况下(如果跳跃(如果相等),如果设置了零标志,就会发生跳转,正如我们前面所了解的那样,如果cmp中的参数相等,就会发生跳转。
https://stackoverflow.com/questions/45898438
复制相似问题