程序集8086中的减法设置了错误的标志

时间:2015-02-10 12:21:32

标签: assembly binary cpu cpu-registers x86-16

我正在尝试进行简单的数学计算。这是我的代码:

mov al, 128
sub al, -128

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

以下是AL

128 = 0x80 = 1000 0000b

第二步是获得-128,这是128的第二个补语,换句话说:

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

所以...我们得到了相同的数字...现在我们必须添加它们,因为那个子正在做的事情,而不是真正的减法,正在添加负数。

最终结果将是:

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

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

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

mov al, 128
sub al, -128

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

2 个答案:

答案 0 :(得分:3)

认为sub与+( - 您的号码)相同。

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

答案 1 :(得分:-1)

当您添加两个数字时,进位标志会在执行最重要的数据时设置。但是当你减去两个数字时,进位标志在x86中反转。在你的例子中,你在进行减法时有一个进位,因此没有设置cf。

cpu正在这样做,因为在进行减法时,它使用进位标志作为借位标志。当你通过添加2s补码进行减法时,当最高位的执行发生时你没有借用。而另一种方式是:没有执行msb意味着发生了借位,因此x86 cpu设置了cf = 1.起初听起来有点奇怪,但对于借用op代码减去非常有用,例如:sbb