asm中的ADC指令

时间:2017-06-14 08:57:55

标签: assembly x86 cpu-registers carryflag

在以下代码中,

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

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

另外,为什么代码清除AH? (我假设因为AL的“ADD”操作可能会产生进位。)

1 个答案:

答案 0 :(得分:10)

要解决这个问题,首先要查看每条指令的作用:

  • 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. 清除AHAH = 0

  4. 它将AH设置为等于CF,由添加NUMBER1NUMBER2设置。因此,如果添加需要进位,则AH将为1,否则为0。 (AH = CF

  5. 对于此代码的目的,它清楚地执行了两个8位数的16位加法。在伪C中,它基本上是:

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

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

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