ASM 8086 中的 ADC 指令
当我使用ADC
作为例子时:
AL = 01 and BL = 02, and CF = 1
当我这样做时:
ADC AL,BL
AL
会是3
还是4
? (有 CF
添加还是没有?)
When I use ADC
for exmaple:
AL = 01 and BL = 02, and CF = 1
when I make this:
ADC AL,BL
Will AL
be 3
or 4
? (with the CF
addition or without?)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
关于
8086
ADC
指令的一些信息:显然,该操作表明进位标志 (
CF
) 将包含在加法中,因此结果将是4
不是3
。Few things about the
8086
ADC
instruction:Clearly the action says the Carry Flag (
CF
) will be included in the addition so the result will be4
not3
.这与以 10 为基数相加没有什么不同。
上述十进制数学的结果是 10,进位为 1,或者如果您想这样想的话,就是 110。
对于以一位加法器开始的二进制,这里有一个真值表:
左列三位是输入组合、两个操作数和进位,
第二列是进位,第三列是结果,
所以没有进位的 1+1 在左列中是 110,结果是 0 进位 1。
与上面的十进制数学没有任何不同,只是简单得多,当您添加十进制向上一列,操作数a,操作数b,进位。结果是答案模 10,进位是结果/10。将进位复制到下一列的顶部并永远重复。如 99+11 或 999+111 等所示。
对于更简单的无进位的两位加法,结果是输入的异或,进位是两个输入的与。您可以使用两个无进位加法器链接的加法来实现带进位的加法,或者直接执行此操作。当存在奇数个一次或奇数奇偶校验时,结果被设置,即两个异或 r = a xor b 异或进位。我目前正在努力解决的进位问题也许有人可以提供帮助。
因此,带有进位集的 8 位 0xFF + 0xFF 将给出
这将显示 0xff + 0xff,并在开始之前输入“进位”。
从右边一次看一列,就像十进制数学一样,
继续下去,你最终会得到
带有进位位设置的 0xFF
因此,如果您只有一个带有进位的 8 位加法,那么您可以将两个数字相加,只要您有内存。
让我们看一下 16 位加法:
您可以使用 16 位加法 0xBE01 进行数学计算。
或使用 8 位加法器:
所以答案是 0xBE01
或者使用 4 位加法器,如果您拥有的只是 4 位 alu,
则结果 0xBE01 进位清零,
我们也可以使用单个位或 3 位加法器来完成此操作,所以只要它是二进制的,它就是微不足道的。
所有有用的处理器都必须有某种方法来添加进位位,以便可以加宽 alu。有时有单独的 add 和 adc,有些 adc 是一个额外的步骤,或者最痛苦的是不带进位的 add,如果进位清除且紧接着其下的 add,则使用分支。
这也是移位或循环通过进位位循环的原因,因此您可以进行比寄存器/内存位置的宽度更宽的位移位。
与十进制相比,二进制乘法简单得令人痛苦,但我会省去你这个,让你思考一下。
是的,您可以而且应该编写一个程序来尝试这一点。而且,我仍然可能故意引导您走上错误信息的道路。
It is no different than adding in base 10.
The result of the above decimal math is 10 with a carry of 1, or 110 if you want to think of it that way.
For binary start with a one bit adder, here is a truth table:
the left column of three bits are the input combinations, two operands and carry in,
the second column is carry out and the third column is the result
so 1+1 with no carry is 110 in the left column and the result is 0 carry the 1.
Not any different than the decimal math above just much simpler, when you add up a column in decimal, operand a, operand b, carry. The result is the answer modulo 10 and the carry is the result/10. copy the carry to the top of the next column and repeat for ever. as demonstrated with 99+11 or 999+111, etc.
For the simpler two bit add with no carry the result is the xor of the inputs and the carry out is the and of the two inputs. You could implement add with carry using two add without carry adders chained or do it directly. The result is set when there are an odd number of onces or odd parity, which is two xors r = a xor b xor carry in. The carry out I am struggling with at the moment perhaps someone can help.
so an 8 bit 0xFF + 0xFF with carry set will give
This shows 0xff + 0xff with a "carry the one" coming in before you start.
look at it one column at a time from the right just like decimal math
this continues and you end up with
0xFF with the carry bit set
So if you had only an 8 bit add with carry you could add up two numbers as wide as you have memory.
Lets look at a 16 bit add:
You could just do the math with a 16 bit add, 0xBE01.
or with an 8 bit adder:
so the answer is 0xBE01
Or using a 4 bit adder if all you have is a 4 bit alu
again the result 0xBE01 carry bit clear
we could do this with single bits as well or a 3 bit adder, so long as it is binary it is trivial.
All useful processors must have some way to add the carry bit so that you can widen the alu. Sometimes there are separate add and adc, some the adc is an extra step or the most painful would be an add without carry and use a branch if carry clear with an add immediate under it.
This is also why shifts or rotates rotate through the carry bit, so you can do a bit shift wider than the width of a register/memory location.
binary multiplication is painfully simple compared to decimal, but I will spare you that one and let you think about it.
Yes, you could have and should have written a program to try this out. And still can, I could be intentionally leading you down a path of misinformation.
AL
将为 4。ADC
表示带进位相加
,因此当然会将进位相加。>CF
被设置回 0,因为所涉及的加法没有进位。AL
will be 4.ADC
meansadd with carry
, so of course the carry is summed in.CF
gets set back to 0, since there is no carry out of the addition in question.将为 4。如果进位标志 (CF) 为 1,ADC(带进位加法)会额外加 1。请参阅操作码的完整说明 此处。
It will be 4. ADC (add with carry) adds in an extra 1 if the carry flag (CF) is 1. See the full description of the opcode here.