St.*_*rio 5 comparison x86 assembly
我对装配很新,现在我想了解它的cmp工作原理.以下是wiki中的内容:
cmp arg2, arg1
Run Code Online (Sandbox Code Playgroud)
在arg1和arg2之间执行比较操作.通过从arg1中减去arg2的(带符号)来执行比较,其结果可以称为Temp.然后丢弃温度.
什么意思"然后丢弃温度"?它存放在哪里?如何访问此比较结果?有人可以解释一下吗?
小智 12
CMP 的结果是改变 ZF 和 CF 的值,这是一些非常理解 CMP 指令的例子。
示例 1:如果 AX < BX
MOV AX,5
MOV BX,8
CMP AX,BX
Run Code Online (Sandbox Code Playgroud)
结果:ZF 和 CF 设置为 ==> "ZF = 0" 和 "CF = 1"
示例 2:如果 AX > BX
MOV AX,8
MOV BX,5
CMP AX,BX
Run Code Online (Sandbox Code Playgroud)
结果:ZF 和 CF 设置为 ==> "ZF = 0" 和 "CF = 0"
示例 3:如果 AX = BX
MOV AX,5
MOV BX,AX
CMP AX,BX
Run Code Online (Sandbox Code Playgroud)
结果:ZF 和 CF 设置为 ==> "ZF = 1" 和 "CF = 0"
我希望你明白 CMP 的结果是改变 ZF 和 CF 的值
ZF = 零标志
CF = 进位标志
Bo *_*son 11
cmp arg2, arg1sub arg2, arg1 除了没有修改任何操作数之外,它执行相同的操作.差异不存储在任何地方.
然而,标志寄存器被更新并且可以在条件跳转中使用,例如jump-if-equal(JE),最常见的是作为之后的下一条指令cmp.
与其他指令相比,优势在于您可以比较两个值而不会破坏它们中的任何一个.如果你这样做sub arg2, arg1并且它们恰好相同,那么其中一个之后就会为零.随着cmp他们都还在那里.
小智 7
我们cmp arg2, arg1在关心 arg1 和 arg 2 是否相等时使用。处理器通过从 arg1 中减去 arg2 来确定这一点,然后查看结果。如果结果为零(即 arg1 = arg2),则处理器设置零标志(“设置标志”,我们的意思是将其设置为 1)。相反,如果结果不为零(即 arg1 != arg2),则处理器清除零标志(即,将其设置为 0)。结果本身被丢弃,因为我们不关心它是什么,只关心它是否为零,我们现在根据是否设置了零标志来了解它。然后,我们可以使用说明喜欢JE,JNE,JZ和JNZ该检查零标志和跳(或不),根据其价值。如果是JE(如果相等则跳转),如果设置了零标志,就会发生跳转,这(正如我们在上面学到的)如果 中的参数cmp相等。
小智 6
我认为现在发布这个问题的答案已经很晚了。但我可以更好地说明 CMP 指令的工作原理。
当您使用比较两个参数时CMP arg1, arg2
CMP 指令根据参数之间的比较设置状态标志。请参阅:维基百科的标志页面
CMP 的重要性主要体现在条件代码执行中(跳转 - 请参阅:assembly_conditions)。当处理器执行条件跳转jcc指令时,它会检查状态标志寄存器,如果满足条件则跳转到目标标签,否则跳转到下一条指令。