我一直在玩装配一段时间并查看一些代码.其中AL首先设置为0x84,然后使用cmp AL,0x30.然后该指令触发溢出标志.
从我读到的CMP应该从第一个数字中减去第二个数字然后设置标志,在这种情况下它应该是0x84-0x30,结果是0x54并且没有溢出.
Car*_*rum 18
如果您将这些值解释为无符号数字,那么只有没有溢出 - 如果您将其解释0x84为已签名,则肯定存在溢出:
-172超出了有符号的8位值(-128到+127)的范围,这就是OF标志设置的原因.您应该检查CF哪个表示无符号溢出.
来自英特尔64和IA-32架构软件开发人员手册,第2卷适用于CMP:
通过从第一个操作数中减去第二个操作数,然后以与SUB指令相同的方式设置状态标志来执行比较.
对于SUB:
SUB指令执行整数减法.它评估有符号和无符号整数操作数的结果,并设置OF和CF标志,分别表示有符号或无符号结果中的溢出.SF标志指示签名结果的符号.