在以下代码中,
MOV AL,NUMBER1
ADD AL,NUMBER2
MOV AH, 00H
ADC AH, 00H第3行和第4行是做什么的?他们干些什么?
此外,为什么代码明确了AH?(我猜是因为AL的"ADD“操作可能会产生进位。)
发布于 2017-06-14 09:08:52
为了解决这个问题,首先查找每条指令所做的事情:
MOV AH, 00H
此 instruction将在不影响标志的情况下将AH寄存器设置为0。ADC AH, 00H
此 instruction将添加源操作数(0)、进位标志(CF)和目标操作数(AH),将结果存储在目标操作数(AH)中。
从象征意义上说,它是这样的:AH = AH + 0 + CF
请记住,MOV不影响标志,因此ADC指令使用的CF值是 instruction先前设置的值(在第2行)。
而且,此时AH是0,所以这实际上就是:AH = CF。现在你知道密码是干什么的了:
NUMBER1移动到AL寄存器:AL = NUMBER1NUMBER2添加到AL寄存器:AL = NUMBER1 + NUMBER2AH:AH = 0AH设置为CF,这是通过添加NUMBER1和NUMBER2设置的。因此,如果添加需要进位,则AH为1,否则为0。(AH = CF)至于这段代码的目的,它显然是执行一个16位加法两个8位数字。在伪C中,它基本上是:
BYTE NUMBER1;
BYTE NUMBER2;
WORD RESULT = (WORD)NUMBER1 + (WORD)NUMBER2;将字节大小的输入扩展到单词并将其相加在一起。为什么要这么做?好吧,处理溢出问题。如果将两个8位值相加,结果可能大于8位值。
要理解这一点,真正的诀窍可能是AL和AH寄存器分别是AX寄存器的下位和上位。因此,在这些说明之后,您可能会看到AX正在被使用。这包含了添加NUMBER1和NUMBER2的16位结果。
https://stackoverflow.com/questions/44540078
复制相似问题