【问题标题】:ADC instruction in ASM 8086ASM 8086 中的 ADC 指令
【发布时间】:2011-02-10 21:47:53
【问题描述】:

当我以ADC 为例时:

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

当我做这个时:

ADC AL,BL 

AL3 还是 4? (是否添加了CF?)

【问题讨论】:

  • 试着养成自己测试这些东西的习惯——这是一种很好的学习方式。
  • +1 Paul R. Tal,如果你自己测试这些东西,你会学得更快,得到更准确的结果。在您输入这个问题并在下面的各种回复中澄清事情的过程中,您可能已经测试了每个场景并得到了明确的答案,同时学习了一些关于 CPU、寄存器和标志的基本知识。

标签: assembly x86-16 machine-instruction


【解决方案1】:

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

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 and ADC AX,BX 会发生什么?我的意思是,计算机将在哪里存储额外的字节?谢谢!!
  • @Tal:如果这样做,AX 将为 0x01FF,CF 将为 0。没有多余的字节。
【解决方案2】:

这与以 10 为底的添加没有什么不同。

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 等所示。

对于更简单的不带进位的两位加法,结果是输入的异或,进位是两个输入的和。您可以使用两个不带进位加法器链接的加法来实现带进位的加法,也可以直接执行。当有奇数个一次或奇偶校验时设置结果,即两个 xor r = a xor b xor 进位。我目前正在努力解决的进位也许有人可以提供帮助。

所以带有进位集的 8 位 0xFF + 0xFF 将给出

1 11111111 +11111111

这显示 0xff + 0xff 在你开始之前有一个“carry the one”进来。

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

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。有时 add 和 adc 是分开的,有些 adc 是一个额外的步骤,或者最痛苦的是一个不带进位的 add,如果有一个 add 直接在其下,则使用一个分支。

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

与十进制相比,二进制乘法简单得令人痛苦,但我会省去你那个,让你考虑一下。

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

【讨论】:

    【解决方案3】:

    AL 将是 4。ADC 表示 add with carry,所以进位当然是相加的。CF 被设置回 0,因为没有进位有问题的添加。

    【讨论】:

    • 如果我这样做:AX = FF, BX = FF, CF = 1 and ADC AX,BX 会发生什么?我的意思是,计算机将在哪里存储额外的字节?谢谢!!
    • @Tal、AX 和 BX 完全能够存储超过一个字节(因为您在这里没有使用像 AL 和 BL 这样的单字节寄存器!)所以结果将是 1FF in AX 和 CF 再次变为 0。
    【解决方案4】:

    它将是 4。如果进位标志 (CF) 为 1,则 ADC(带进位加法)加 1。请参阅操作码 here 的完整说明。

    【讨论】:

      猜你喜欢
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 2016-05-17
      • 2016-04-26
      • 1970-01-01
      相关资源
      最近更新 更多