汇编 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
它只会设置ZF和PF,但没有CF。问题是为什么?
我做错了什么?
sub 与 +(- 你的号码) 相同的想法。
对于CPU这不是真的。您的第一个数字和第二个数字相等。作为人类,您理解第二个数字是负数这一事实对处理器没有影响。它将减去 2 个相等的数字,因此不需要借位。
当您将两个数字相加时,进位标志会在最高位发生进位时设置。但是当你减去两个数字时,进位标志在 x86 中被反转。在您的示例中,您在进行减法时有一个进位,因此未设置 cf。
cpu是这样做的,因为在做减法时它使用进位标志作为借位标志。当您通过添加 2s 补码进行减法时,当最高有效位发生进位时,您没有借位。反之亦然:没有进位 msb 意味着发生借位,因此 x86 cpu 设置 cf = 1。起初听起来有点奇怪,但对于使用借位操作码进行减法非常有用,例如:某人
我正在尝试做一个简单的数学计算。这是我的代码:
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
它只会设置ZF和PF,但没有CF。问题是为什么? 我做错了什么?
sub 与 +(- 你的号码) 相同的想法。
对于CPU这不是真的。您的第一个数字和第二个数字相等。作为人类,您理解第二个数字是负数这一事实对处理器没有影响。它将减去 2 个相等的数字,因此不需要借位。
当您将两个数字相加时,进位标志会在最高位发生进位时设置。但是当你减去两个数字时,进位标志在 x86 中被反转。在您的示例中,您在进行减法时有一个进位,因此未设置 cf。
cpu是这样做的,因为在做减法时它使用进位标志作为借位标志。当您通过添加 2s 补码进行减法时,当最高有效位发生进位时,您没有借位。反之亦然:没有进位 msb 意味着发生借位,因此 x86 cpu 设置 cf = 1。起初听起来有点奇怪,但对于使用借位操作码进行减法非常有用,例如:某人