在下面的代码中,
MOV AL,NUMBER1
ADD AL,NUMBER2
MOV AH, 00H
ADC AH, 00H
第 3 行和第 4 行是干什么用的?他们在做什么?
另外,为什么代码会清除AH?(我假设是因为 AL 的“ADD”操作可能会产生进位。)
在下面的代码中,
MOV AL,NUMBER1
ADD AL,NUMBER2
MOV AH, 00H
ADC AH, 00H
第 3 行和第 4 行是干什么用的?他们在做什么?
另外,为什么代码会清除AH?(我假设是因为 AL 的“ADD”操作可能会产生进位。)
要弄清楚这一点,首先要查看每条指令的作用:
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
。
现在您知道代码的作用了:
它NUMBER1
移入AL
寄存器:AL = NUMBER1
它添加NUMBER2
到AL
寄存器中:AL = NUMBER1 + NUMBER2
它清除AH
:AH = 0
它设置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 位的值。
理解这一点的真正技巧可能是AL
和AH
寄存器分别是寄存器的低位和高位AX
。因此,在这些说明之后,您可能会立即看到AX
正在使用。这包含和相加的 16 位结果。NUMBER1
NUMBER2