请大家帮忙看看小弟我对这个顺序程序的第二种解法的理解有什么有关问题
请大家帮忙看看我对这个顺序程序的第二种解法的理解有什么问题?
例1:设X和 Y均为16位无符号数,写一个求表达式`16X+Y值的程序。
由于表达式中的X和Y是16位数,表达式的结果可能要超出16位,所以定义两个自变量用于保存X和Y,另外用一个32位的双字变量来保存结果。数据段可定义如下:
;程序名:T3-2.ASM
;功能:计算16X+Y
DSEG SEGMENT
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
ADC DX, DX
ADD AX, AX ;X*4
ADC DX, DX
ADD AX, AX ;X*8
ADC DX, DX
ADD AX, AX ;X*16
ADC DX, DX
ADD AX, YYY ;(4)在X*16的结果上再加Y
ADC 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
第(3)步是计算X*16,采用了四次自身相加的方法达到乘16的目的。也可采用移位的方法达到乘16的目的,这样就不能简单地把16位扩展到32位,第(2)步和第(3)步可合并如下:
MOV AX,XXX ;X送AX
MOV DX,AX ;X送DX
MOV CL, 4
SHL AX,CL ;AX左移4位等价于乘16
MOV CL,12
SHR DX,CL ;等价于得AX的高4位
问题:第二种用移位的方法来达到乘16的目的的方法中,我有三点弄不明白。
(一)前两句: MOV AX,XXX
MOV DX, AX
这两句没把16位扩展到32位吗?
(二)下面两句 MOV CL, 4
SHL AX,CL ;AX左移4位等价于乘16
因为AX的内容为0,所以DX和AX中的内容为23400000H,前面的1被移走了,是这样吗?
(三) MOV CL,12
SHR DX,CL ;等价于得AX的高4位
刚相乘完又向右移12位,这是什么意思,移完的最后结果应该是什么? 具体这第二种方法的变化详细步骤,请前辈们
------解决方案--------------------
例1:设X和 Y均为16位无符号数,写一个求表达式`16X+Y值的程序。
由于表达式中的X和Y是16位数,表达式的结果可能要超出16位,所以定义两个自变量用于保存X和Y,另外用一个32位的双字变量来保存结果。数据段可定义如下:
;程序名:T3-2.ASM
;功能:计算16X+Y
DSEG SEGMENT
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
ADC DX, DX
ADD AX, AX ;X*4
ADC DX, DX
ADD AX, AX ;X*8
ADC DX, DX
ADD AX, AX ;X*16
ADC DX, DX
ADD AX, YYY ;(4)在X*16的结果上再加Y
ADC 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
第(3)步是计算X*16,采用了四次自身相加的方法达到乘16的目的。也可采用移位的方法达到乘16的目的,这样就不能简单地把16位扩展到32位,第(2)步和第(3)步可合并如下:
MOV AX,XXX ;X送AX
MOV DX,AX ;X送DX
MOV CL, 4
SHL AX,CL ;AX左移4位等价于乘16
MOV CL,12
SHR DX,CL ;等价于得AX的高4位
问题:第二种用移位的方法来达到乘16的目的的方法中,我有三点弄不明白。
(一)前两句: MOV AX,XXX
MOV DX, AX
这两句没把16位扩展到32位吗?
(二)下面两句 MOV CL, 4
SHL AX,CL ;AX左移4位等价于乘16
因为AX的内容为0,所以DX和AX中的内容为23400000H,前面的1被移走了,是这样吗?
(三) MOV CL,12
SHR DX,CL ;等价于得AX的高4位
刚相乘完又向右移12位,这是什么意思,移完的最后结果应该是什么? 具体这第二种方法的变化详细步骤,请前辈们
------解决方案--------------------