请问《80x86汇编语言程序设计教程》上的一个例子
求16X+Y的值:(杨季文《80x86汇编语言程序设计教程》最新版,p81)
表达式的结果可能超出16位,所以定义两个字变量用于保存X和Y,另外用一个32位的双字变量来保存结果。
用DX和AX保存中间结果,DX保存高16位,AX保存低16位。
DSEG SEGMEN
XXX DW 1234H ;设X为1234H
YYY DW 5678H ;设Y为5678H
ZZZ DD ? ;用于保存结果
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START: MOV AX,DSEG ;(1)设置数据段寄存器值
MOV DS,AX
MOV AX,XXX ;(2)把X送AX并扩展到32位
XOR DX,DX
ADD AX,AX ;(3)计算X*16
ADDC DX,DX
ADD AX,AX ;X*4
ADDC DX,DX
ADD AX,AX ;X*8
ADDC DX,DX
ADD AX,AX ;X*16
ADDC DX,DX
ADD AX,YYY ;(4)在X*16结果上再加上Y
ADDC DX,0
MOV WORD PTR ZZZ,AX ;(5)保存结果
MOV WORD PTR ZZZ+2,DX
MOV AH,4CH ;(6)返回DOS
INT 21H
CSEG ENDS
END START
我猜得出程序的意思是用循环的方式来做X*16,但看不懂:
1)XOR DX,DX的作用。-> 这行的结果岂不是DX=0?
2)ADDC DX,DX的作用。-> 既然DX=0,这样带进位加有什么用呢?
我没看到“DX保存高16位”这样的表达式,怀疑是不是DX应该有个赋值的过程?
谢谢!