首页 > 解决方案 > x86架构是否以特殊方式处理零的二进制减法/与零比较?

问题描述

在再次处理 x86 程序集时,我遇到了一种情况,我试图了解如何解释 cpu 的行为。

当用命令比较两个无符号整数时cmp,进位和零标志的状态反映了两个整数的关系。因为在没有将减法结果写入最终寄存器的情况下cmp表现得像命令,所以进位标志占据了借位标志的一部分。sub此外,减法只不过是反转值的加法。因此,cpu 不是减 1,而是加 -1。

现在,当被减数小于减数时,加法cmp将导致无进位,但由于需要借位,必须设置进位标志。所以你可以说进位标志必须在加法后反转以获得正确的状态。
前一个假设适用于无符号整数的每种组合,但有一个例外:

从任何无符号整数中减去零与向它们添加零相同,这不会产生进位。因此,反转进位会导致设置进位标志不正确,因为被减数(<0)大于减数(0),这就是为什么不允许设置进位标志,因为不需要借位。

我用一个小汇编程序检查了这种行为,当然,cpu 不会产生设置进位标志。但这只有在 cpu 还检查减数为零(并且被减数不为零,minuend = subtrahend -> 零标志设置)时才有可能。

我的假设是正确的还是我遗漏了什么?

标签: assemblyx86eflags

解决方案


你的直觉几乎是正确的。这是缺少的位:减法可以通过补充被减数、传入进位(0 表示sub,变为 1)和传出进位来实现。当您从某个数字中减去 0 时,添加的是0xffffffff(假设是 32 位 CPU)和反向进位中的 1。因此,我们实际上添加0x100000000,设置传出进位(即清除传出借位)。这是您的模型的区别,其中将添加 0,而不是设置传出进位(即设置传出借位),


推荐阅读