ASM 8086中的ADC指令

Tal*_*Tal 11 assembly machine-instruction x86-16

当我ADC用于exmaple时:

AL = 01 and BL = 02, and CF = 1
Run Code Online (Sandbox Code Playgroud)

当我做这个:

ADC AL,BL 
Run Code Online (Sandbox Code Playgroud)

AL34?(CF加或不加?)

cod*_*ict 11

关于8086 ADC指令的一些事情:

Syntax: adc dest, src
dest: memory or register
src:  memory, register, or immediate
Action: dest = dest + src + CF
Run Code Online (Sandbox Code Playgroud)

显然,该动作表示Carry Flag(CF)将包含在添加中,因此结果4不会3.


old*_*mer 5

它与以10为基数添加没有什么不同。

 99
+11

9 + 1是零携带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,结果为1的进位为0。

与上面的十进制数学没什么不同,只是将十进制,操作数a,操作数b,进位加起来的方式更为简单。结果为模10的答案,进位为结果/ 10。将进位复制到下一列的顶部,并永远重复一次。如99 + 11或999 + 111等所示。

对于没有进位的简单两位加法,结果是输入的异或,进位是两个输入的和。您可以使用两个不带进位加法器的加法来实现加进位加法,也可以直接执行。当有一次奇数次或奇偶校验时设置结果,这是两个xor r = a xor b xor随身携带。我目前正在苦苦挣扎的随身物品也许有人可以提供帮助。

因此带有进位设置的8位0xFF + 0xFF将给出

        1个
 11111111
+11111111 

这显示0xff + 0xff,在您开始之前会出现“携带一个”字样。

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

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位加法器(如果您只有4位ALU)

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

再次将结果0xBE01进位清除

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

所有有用的处理器都必须有某种方式来添加进位,以便您可以扩展alu。有时会有单独的添加和adc,某些adc是一个额外的步骤,或者最痛苦的是没有进位的添加,如果在进位下带有立即清零的进位,则使用分支。

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

与十进制相比,二进制乘法非常简单,但我将为您省一分,让您考虑一下。

是的,您可能并且应该已经编写了一个程序来尝试此操作。而且仍然可以,我可能会故意带您走错消息的道路。


Ale*_*lli 4

AL将为 4. ADC意味着add with carry,因此进位当然会被累加。 CF设置回 0,因为所讨论的加法没有进位。