当我使用ADC
时:
AL = 01 and BL = 02, and CF = 1
当我这样做时:
ADC AL,BL
AL
会3
还是4
? (添加CF
或不添加?)
答案 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的完整描述。