我正在尝试做一个简单的数学计算。这是我的代码:
mov al, 128
sub al, -128
我需要知道 sub 指令设置了哪些标志。我的计算是这样的。从 sub
与 +(- your number)
相同的想法开始。从 mov, al 128 开始,我们有这个:
这是AL
:
128 = 0x80 = 1000 0000b
第二步,得到-128
,也就是128的二次补码,即:
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 与 +(- your number) 相同的想法。
对于 CPU 来说,这是不正确的。您的第一个数字和第二个数字相等。作为人类,您理解第二个数字是负数这一事实对处理器没有影响。它将减去 2 个相等的数字,因此不需要借位。
关于assembly - 汇编 8086 中的减法设置了错误的标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28431580/