作者:艺维网络传媒 | 来源:互联网 | 2023-02-01 12:20
在以下代码中,
MOV AL,NUMBER1
ADD AL,NUMBER2
MOV AH, 00H
ADC AH, 00H
第3和第4行是什么?他们在做什么?
另外,为什么代码清除AH?(我假设因为AL的"ADD"操作可能会产生进位.)
1> Cody Gray..:
要弄清楚这一点,首先要查看每条指令的作用:
MOV AH, 00H
该MOV
指令将AH
寄存器设置为0 而不影响标志.
ADC AH, 00H
该ADC
指令将添加源操作数(0),进位标志(CF)和目标操作数(AH
),将结果存储在目标操作数(AH
)中.
符号上,它确实: AH = AH + 0 + CF
请记住,MOV
没有影响的标志,以便使用由CF值ADC
指示任何先前被设置ADD
指令(在第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
被使用.这包含添加和的16位结果.NUMBER1
NUMBER2