asm中的ADC指令

ADC instruction in asm

在下面的代码中,

MOV AL,NUMBER1
ADD AL,NUMBER2
MOV AH, 00H
ADC AH, 00H

第 3 行和第 4 行是做什么用的?他们是做什么的?

还有,为什么代码会清除AH? (我假设是因为 AL 的 "ADD" 操作可能会产生进位。)

要弄清楚这一点,首先要查看每条指令的作用:

  • MOV AH, 00H

    MOV instruction 会将 AH 寄存器设置为 0 而不会 影响标志。

  • ADC AH, 00H

    这个ADC instruction会将源操作数(0)、进位标志(CF)和目标操作数(AH)相加,将结果存储在目标操作数(AH).

    那么,象征性地,它确实是:AH = AH + 0 + CF

    请记住,MOV 不影响标志,因此 ADC 指令使用的 CF 值是之前由 ADD instruction 设置的值(行2).

    此外,此时 AH 为 0,所以这实际上只是:AH = CF.

现在您知道代码的作用了:

  1. 它将NUMBER1移动到AL寄存器中:AL = NUMBER1

  2. 它将NUMBER2添加到AL寄存器:AL = NUMBER1 + NUMBER2

  3. 清除AH: AH = 0

  4. 它设置 AH 等于 CF,正如 NUMBER1NUMBER2 相加所设置的那样。因此,如果加法需要进位,AH 将为 1,否则为 0。 (AH = CF)

至于这段代码的目的,明明就是对两个8位的数进行了16位的加法运算。在伪 C 中,它基本上是:

BYTE NUMBER1;
BYTE NUMBER2;
WORD RESULT = (WORD)NUMBER1 + (WORD)NUMBER2;

其中 BYTE 大小的输入被扩展为 WORD 并加在一起。为什么要这样做?那么,处理溢出。如果将两个 8 位值相加,结果可能会大于 8 位。

理解这一点的真正技巧可能是 ALAH 寄存器分别是 AX 寄存器的低位和高位。因此,在这些说明之后,您可能会立即看到正在使用 AX。这包含 NUMBER1NUMBER2.

相加的 16 位 结果