【发布时间】:2017-01-19 20:14:19
【问题描述】:
我在调试时遇到了这个比较:
| 38 19 | CMP BYTE PTR DS:[ECX], BL
我在上面设置了一个断点并看到了这个(hex中的值):
ECX = 00838430
BYTE PTR[ECX]=[00838430]=55
EBX = 00000055 (BL = 55)
EFLAGS = 00000314 (CF=0 OF=0 SF=0 ZF=0 AF=1 PF=1)
所以我希望在执行这个比较之后设置零标志,因为 ECX 和 BL 指向的字节是相等的。然而,结果却是设置了溢出标志,ZF 保持为 0。比较之后:
EFLAGS = 00000A06 (CF=0 OF=1 SF=0 ZF=0 AF=0 PF=1)
为什么会这样?它与有符号/无符号整数有关吗?我认为 CMP 是不可知的,即将比较结果解释为有符号/无符号是以下分支指令会做的事情(例如 JG 与 JA)。比较之后是一个 JNE,因为 ZF=0 并导致不正确的结果。
【问题讨论】:
-
通常
CMP确实设置了正确的标志,并且您显示的值表明应该设置 ZF,所以我 99% 确定您描述的值之一是不正确的。我会先验证内存内容,你确定ds:[ecx]有 55 个吗?你是怎么得到那个号码的?这是 32b 模式与平面内存模型(ds = 那时不重要)吗? -
请记住
CMP确实正确设置了标志。责怪代码,而不是处理器。 -
好吧,从技术上讲,您可能已经损坏了 CPU,在
CMP之后产生了不正确的标志,但除非这是由于 X 射线碰撞/等而导致的电子游荡的一次性事故。 (可能会发生,随着日常生活中 HW 的数量,至少有少数目前活着的人类会在他们的生活中至少遇到一次这种情况......尽管他们很可能不会注意到),它会产生很多坏的结果,您永远无法启动操作系统并运行调试器...因此,如果您不相信cmp,请再试一次,仅此而已,搜索周围的问题。
标签: assembly x86 compare cmp eflags