ASM 8086中的ADC指令

时间:2010-04-22 04:30:15

标签: assembly x86-16 machine-instruction

当我使用ADC时:

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

当我这样做时:

ADC AL,BL 

AL3还是4? (添加CF或不添加?)

4 个答案:

答案 0 :(得分:10)

关于8086 ADC指令的几点内容:

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

显然,操作说明进位标记(CF)将包含在添加中,因此结果将为4而不是3

答案 1 :(得分:4)

与添加基数10无异。

 99
+11

9+1 is zero carry the 1
9+1+carry is 1 carry the 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,执行是两个输入的和。你可以使用两个add来实现add with carry而不带链接加法器或直接执行。当存在奇数个on或奇数奇偶校验时,结果被设置,这是两个x = r = a x或b xor进位。执行我正在努力,此时也许有人可以帮助。

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

        1
 11111111
+11111111 

这显示0xff + 0xff,在你开始之前有一个“携带一个”。

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

1+1+1 = 1 carry the 1
next column
1+1+1 = 1 carry the 1
...

这继续,你最终 进位设置为0xFF

所以,如果你只有8位的附加值,你可以加两个数字,就像你有记忆一样宽。

让我们看一下16位的补充:

 0x1234
+0xABCD

您可以使用16位加,0xBE01进行数学计算。

或使用8位加法器:

clear the carry bit
add with carry 0x34+0xCD result 0x01 carry set
add with carry 0x12+0xAB result 0xBE carry clear

所以答案是0xBE01

如果您拥有的是4位alu

,则使用4位加法器
clear the carry bit
add with carry 0x4+0xD = 0x1 carry bit set
add with carry 0x3+0xC = 0x0 carry bit set
add with carry 0x2+0xB = 0xE carry bit clear
add with carry 0x1+0xA = 0xB carry bit clear

再次结果0xBE01进位清除

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

所有有用的处理器必须有一些方法来添加进位,以便您可以加宽alu。有时候会有单独的添加和adc,有些adc是额外的步骤,或者最痛苦的是没有携带的添加,如果带有明确的添加立即,则使用分支。

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

与十进制相比,二进制乘法很简单,但是我会饶你那么让你考虑一下。

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

答案 2 :(得分:3)

AL将为4. ADC表示add with carry,因此当然> 总和。CF被设置回0 ,因为没有执行相关的添加。

答案 3 :(得分:3)

如果进位标志(CF)为1,则ADC(带进位加)加1。请参阅操作码here的完整描述。