asm中的ADC指令
ADC instruction in asm
在下面的代码中,
MOV AL,NUMBER1
ADD AL,NUMBER2
MOV AH, 00H
ADC AH, 00H
第 3 行和第 4 行是做什么用的?他们是做什么的?
还有,为什么代码会清除AH? (我假设是因为 AL 的 "ADD" 操作可能会产生进位。)
要弄清楚这一点,首先要查看每条指令的作用:
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 位 结果
在下面的代码中,
MOV AL,NUMBER1
ADD AL,NUMBER2
MOV AH, 00H
ADC AH, 00H
第 3 行和第 4 行是做什么用的?他们是做什么的?
还有,为什么代码会清除AH? (我假设是因为 AL 的 "ADD" 操作可能会产生进位。)
要弄清楚这一点,首先要查看每条指令的作用:
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
.