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

标签 assembly binary cpu cpu-registers x86-16

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

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

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

最佳答案

sub 与 +(- your number) 相同的想法。

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

关于assembly - 汇编 8086 中的减法设置了错误的标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28431580/

相关文章:

linux - 为什么在线CPU的数量等于n-1,而n是CPU的总数?

CPU 负载和 CPU 温度的 C++ 代码

汇编编号转为 ascii

assembly - 为什么影响edx会影响整个rdx?

shell - 无空 Shellcode

assembly - 指令集和汇编语言是一回事吗?

count - 查找表设置位计数算法的提示

java - 如何使用JAVA读取C/Matlab创建的二进制文件

javascript - 在第一个方法调用时执行所有 if-body 的正确方法

mysql - Amazon RDS CPU 峰值