在再次处理 x86 程序集时,我遇到了一种情况,我试图了解如何解释 cpu 的行为。
当用命令比较两个无符号整数时cmp
,进位和零标志的状态反映了两个整数的关系。因为在没有将减法结果写入最终寄存器的情况下cmp
表现得像命令,所以进位标志占据了借位标志的一部分。sub
此外,减法只不过是反转值的加法。因此,cpu 不是减 1,而是加 -1。
现在,当被减数小于减数时,加法cmp
将导致无进位,但由于需要借位,必须设置进位标志。所以你可以说进位标志必须在加法后反转以获得正确的状态。
前一个假设适用于无符号整数的每种组合,但有一个例外:
从任何无符号整数中减去零与向它们添加零相同,这不会产生进位。因此,反转进位会导致设置进位标志不正确,因为被减数(<0)大于减数(0),这就是为什么不允许设置进位标志,因为不需要借位。
我用一个小汇编程序检查了这种行为,当然,cpu 不会产生设置进位标志。但这只有在 cpu 还检查减数为零(并且被减数不为零,minuend = subtrahend -> 零标志设置)时才有可能。
我的假设是正确的还是我遗漏了什么?