11

当我ADC用于示例时:

AL = 01 and BL = 02, and CF = 1

当我做这个时:

ADC AL,BL 

AL34?(CF加还是不加?)

4

4 回答 4

12

8086 ADC关于指令的几件事:

Syntax: adc dest, src
dest: memory or register
src:  memory, register, or immediate
Action: dest = dest + src + CF

显然,该动作表示进位标志 ( CF) 将包含在加法中,因此结果4不会3

于 2010-04-22T04:35:12.467 回答
6

这与以 10 为底添加没有什么不同。

99
+11

9+1 是 0 携带 1
9+1+进位就是1进位就是1

上述十进制数学的结果是 10,进位为 1,或者如果你想这样想的话,是 110。

对于以一位加法器开头的二进制,这是一个真值表:

000 0 0
001 0 1
010 0 1
011 1 0
100 0 1
101 1 0
110 1 0
111 1 1

左边三位是输入组合,两个操作数和进位,第二列是进位,第三列是结果

所以没有进位的 1+1 是左列中的 110,结果是 0 进位 1。

与上面的十进制数学没有任何不同,只是简单得多,当您将十进制的一列相加时,操作数 a,操作数 b,进位。结果是答案模 10,进位是结果/10。将进位复制到下一列的顶部并永远重复。如 99+11 或 999+111 等所示。

对于更简单的不带进位的两位加法,结果是输入的异或,进位是两个输入的和。您可以使用两个不带进位加法器链接的加法来实现带进位的加法,也可以直接执行。当有奇数个一次或奇偶校验时设置结果,即两个 xor r = a xor b xor 进位。我目前正在努力解决的进位也许有人可以提供帮助。

所以带有进位设置的 8 位 0xFF + 0xFF 将给出

        1
 11111111
+11111111

这显示 0xff + 0xff 在您开始之前带有“carry the one”。

就像十进制数学一样,从右边一次看一列

1+1+1 = 1 携带 1
下一栏
1+1+1 = 1 携带 1
...

这种情况继续下去,你最终得到 0xFF 并设置了进位位

因此,如果您只有一个带进位的 8 位加法,则可以将两个数字加起来,与您的记忆一样宽。

让我们看一个 16 位加法:

0x1234
+0xABCD

您可以使用 16 位加法 0xBE01 来计算。

或使用 8 位加法器:

清除进位
加进位 0x34+0xCD 结果 0x01 进位集
带进位相加 0x12+0xAB 结果 0xBE 进位清零

所以答案是 0xBE01

或者如果你只有一个 4 位 alu,则使用 4 位加法器

清除进位
添加进位 0x4+0xD = 0x1 进位位设置
添加进位 0x3+0xC = 0x0 进位位设置
加进位 0x2+0xB = 0xE 进位清零
加进位 0x1+0xA = 0xB 进位位清零

再次将结果 0xBE01 进位位清除

我们也可以使用单个位或 3 位加法器来做到这一点,只要它是二进制的,它就很简单。

所有有用的处理器都必须有某种方法来添加进位位,以便您可以加宽 alu。有时有单独的 add 和 adc,有些 adc 是一个额外的步骤,或者最痛苦的是一个不带进位的 add,如果有一个 add 直接在其下,则使用一个分支。

这也是为什么移位或旋转通过进位位旋转的原因,因此您可以进行比寄存器/内存位置宽度更宽的位移。

与十进制相比,二进制乘法简单得令人痛苦,但我会放过你,让你考虑一下。

是的,您可以并且应该编写一个程序来尝试一下。仍然可以,我可能是故意引导你走上错误信息的道路。

于 2010-04-22T18:49:34.973 回答
4

AL将是 4. ADC意味着add with carry,所以进位当然相加的。 CF被设置回 0,因为有问题的加法没有进位。

于 2010-04-22T04:34:27.413 回答
4

它将是 4。如果进位标志 (CF) 为 1,则 ADC(带进位相加)添加一个额外的 1。请参阅此处操作码的完整描述。

于 2010-04-22T04:34:56.867 回答