汇编 8086 中的减法设置了错误的标志

Substraction in assembly 8086 sets wrong flags

我正在尝试做一个简单的数学计算。这是我的代码:

mov al, 128
sub al, -128

我需要知道 sub 指令设置了哪些标志。我的计算是这样的。从 sub+(- your number) 相同的想法开始。从 mov, al 128 开始,我们有:

这里是AL:

128 = 0x80 = 1000 0000b

第二步,得到-128,也就是128的2次补码,即:

 128 = 1000 0000b
-128 = 0111 1111b (1st complement) + 1 = 1000 0000b

所以......我们得到了相同的数字......现在我们必须将它们相加,因为这就是 sub 所做的,而不是真正的减法,是与负数相加。

最终结果为:

 1000 0000b +
 1000 0000b
 ----------
10000 0000b

这表明设置了以下标志:CF(有进位),ZF(AL 中为 0),以及PF(从 d0 到 d3 的偶数个 1)。

如果我运行同样的代码,又是:

mov al, 128
sub al, -128

它只会设置ZFPF,但没有CF。问题是为什么? 我做错了什么?

sub 与 +(- 你的号码) 相同的想法。

对于CPU这不是真的。您的第一个数字和第二个数字相等。作为人类,您理解第二个数字是负数这一事实对处理器没有影响。它将减去 2 个相等的数字,因此不需要借位。

当您将两个数字相加时,进位标志会在最高位发生进位时设置。但是当你减去两个数字时,进位标志在 x86 中被反转。在您的示例中,您在进行减法时有一个进位,因此未设置 cf。

cpu是这样做的,因为在做减法时它使用进位标志作为借位标志。当您通过添加 2s 补码进行减法时,当最高有效位发生进位时,您没有借位。反之亦然:没有进位 msb 意味着发生借位,因此 x86 cpu 设置 cf = 1。起初听起来有点奇怪,但对于使用借位操作码进行减法非常有用,例如:某人