当我ADC
用于示例时:
AL = 01 and BL = 02, and CF = 1
当我做这个时:
ADC AL,BL
将AL
是3
或4
?(CF
加还是不加?)
当我ADC
用于示例时:
AL = 01 and BL = 02, and CF = 1
当我做这个时:
ADC AL,BL
将AL
是3
或4
?(CF
加还是不加?)
8086
ADC
关于指令的几件事:
Syntax: adc dest, src
dest: memory or register
src: memory, register, or immediate
Action: dest = dest + src + CF
显然,该动作表示进位标志 ( CF
) 将包含在加法中,因此结果4
不会3
。
这与以 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 直接在其下,则使用一个分支。
这也是为什么移位或旋转通过进位位旋转的原因,因此您可以进行比寄存器/内存位置宽度更宽的位移。
与十进制相比,二进制乘法简单得令人痛苦,但我会放过你,让你考虑一下。
是的,您可以并且应该编写一个程序来尝试一下。仍然可以,我可能是故意引导你走上错误信息的道路。
AL
将是 4. ADC
意味着add with carry
,所以进位当然是相加的。 CF
被设置回 0,因为有问题的加法没有进位。
它将是 4。如果进位标志 (CF) 为 1,则 ADC(带进位相加)添加一个额外的 1。请参阅此处操作码的完整描述。