在以下代码中,
MOV AL,NUMBER1
ADD AL,NUMBER2
MOV AH, 00H
ADC AH, 00H
第3和第4行是什么?他们做了什么?
另外,为什么代码清除AH? (我假设因为AL的“ADD”操作可能会产生进位。)
答案 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
。
现在您知道代码的作用了:
它将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
被使用。这包含添加NUMBER1
和NUMBER2
的16位结果。