ASM 8086中的ADC指令

12

举例来说,当我使用ADC时:

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

当我执行以下操作时:

ADC AL,BL 

AL会是3还是4?(包括CF加法或不包括?)


4
尝试养成自己测试这些东西的习惯 - 这是学习的好方法。 - Paul R
Paul R. Tal,如果您自己测试这些内容,您将学得更快,获得更准确的结果。在您输入这个问题并在下面的各种回复中澄清事情的时间内,您可以测试每种情况并得出明确的答案,同时学习一些关于CPU、寄存器和标志的基本知识。 - JUST MY correct OPINION
4个回答

12

关于8086ADC指令有几件事情:

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

显然,操作指令表明进位标志 (CF) 将被包括在加法中,因此结果将是 4 而不是 3


如果我这样做:AX = FF,BX = FF,CF = 1 然后执行 ADC AX,BX 会发生什么?我的意思是,计算机会把额外的字节存储在哪里?谢谢! - Tal
@Tal:如果你这样做,AX将会是0x01FF,CF则为0。没有多余的字节。 - Adam Rosenfield

6
这与十进制加法没有区别。
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等所示。
对于没有进位的更简单的两位加法,结果是输入的异或,进位输出是两个输入的and。您可以使用两个链接的add without carry adders实现带进位的add,也可以直接执行。当有奇数个onces或奇校验时,结果被设置,即两个xors r = a xor b xor carry in。我现在正在努力解决进位问题,也许有人可以帮忙。
因此,带进位的0xFF + 0xFF的8位结果为
1 11111111 +11111111
这显示了在开始之前“进位1”的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位的ALU,可以使用4位加法器。
清除进位位
带进位相加0x4 + 0xD = 0x1,设置进位位
带进位相加0x3 + 0xC = 0x0,设置进位位
带进位相加0x2 + 0xB = 0xE,清除进位位
带进位相加0x1 + 0xA = 0xB,清除进位位

结果是0xBE01,进位位清除。

我们也可以使用单个位或3位加法器来实现,只要是二进制就很简单。

所有有用的处理器必须有一种方法来添加进位位,以便您可以扩展ALU。有时会有单独的加法和ADC,有些ADC是额外的步骤,或者最痛苦的是没有进位加法,并在其下使用立即加法进行分支。

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

与十进制相比,二进制乘法非常简单,但我不会详细说明。

是的,您可以并且应该编写程序来尝试此操作。而且仍然可以,我可能会故意引导您走向错误的道路。


4

AL 将会是4。 ADC 意味着“带进位加法”,因此进位被计算在内。由于这个加法没有进位,所以 CF 被设置为0。


如果我这样做:AX = FF,BX = FF,CF = 1并且ADC AX,BX会发生什么?我的意思是,计算机将在哪里存储额外的字节?谢谢! - Tal
1
@Tal,AX和BX完全能够存储多个字节(因为这里没有使用单字节寄存器,如AL和BL!),所以结果将是1FF在AX中,并且CF再次为0。 - Alex Martelli

4

这是关于IT技术的内容,具体是关于ADC操作码的翻译。

ADC(带进位加法)操作码在CF标志位为1时,会多加1。详细信息请参见此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接