5

在下面的代码中,

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

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

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

4

1 回答 1

10

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

  • MOV AH, 00H

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

  • ADC AH, 00H

    ADC指令将源操作数 (0)、进位标志 (CF) 和目标操作数 ( AH) 相加,并将结果存储在目标操作数 ( AH) 中。

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

    请记住,MOV不影响标志,因此指令使用的 CF 值是指令ADC先前设置的值(在第 2 行)。ADD

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

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

  1. NUMBER1移入AL寄存器:AL = NUMBER1

  2. 它添加NUMBER2AL寄存器中:AL = NUMBER1 + NUMBER2

  3. 它清除AHAH = 0

  4. 它设置AH等于 CF,通过添加NUMBER1和设置NUMBER2。因此,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正在使用。这包含和相加的 16 位结果NUMBER1NUMBER2

于 2017-06-14T09:08:52.490 回答