用乘法指令实现32位二进制数与16位二进制数相乘,最后在屏幕上输出结果。
悬赏分:50 - 解决时间:2009-12-14 09:23
最佳答案:
;--------------------
完整的程序如下。
DATA SEGMENT
;A中第一个字存高16位被乘数,第二个字存低16位被乘数
;B中存16位乘数
;CDE存结果,C存32位到47位,D存16位到31位,E存0位到15位
A DW 1111H, 2222H
B DW 3333H
C DW ?
D DW ?
E DW ?
F DB 0, 0, 0, 0, 0, 0, 0, 0 ;存放BCD码
DATA ENDS
;--------------------
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV AX, [A+2]
MOV BX, [B]
MUL BX
MOV [D], DX
MOV [E], AX
MOV AX, [A]
MUL BX
MOV [C], DX
ADD [D], AX
ADC [C], 0
;---------------以上是“一般般拉风”编写的乘法部分------------
;---------------------------以下是做而论道编写的输出部分-----
MOV CX, 48 ; 48位数变换成BCD码
_L1_:
XOR AX, AX
MOV AX, [E]
ADD AX, AX
MOV [E], AX
MOV AX, [D]
ADC AX, AX
MOV [D], AX
MOV AX, [C]
ADC AX, AX
MOV [C], AX
LEA SI, F+7
PUSH CX
MOV CX, 8
_L2_:
MOV AL, [SI]
ADC AL, AL
DAA
MOV [SI], AL
DEC SI
LOOP _L2_
POP CX
LOOP _L1_
;---------------------------以下是显示BCD码------------
LEA SI, F
MOV CX, 8
_L3_:
MOV AL, [SI]
MOV AH, 0
MOV DL, 16
DIV DL
MOV DL, AL
AND DL, 0FH
ADD DL, 30H
MOV AH, 02H
INT 21H
MOV DL, [SI]
AND DL, 0FH
ADD DL, 30H
MOV AH, 02H
INT 21H
INC SI
LOOP _L3_
MOV AH, 4CH
INT 21H
CODE ENDS
END START
;------------------------------------------------
;本程序进行了如下乘法:
;11112222H × 3333H = 0369 D036 92C6H
;应该显示如下结果:
;00 03 75 29 99 68 68 54
;------------------------------------------------
参考资料:一般般拉风 的回答。
回答者: 做而论道 - 十一级 2009-12-14 01:38
;------------------------------------------------
提问者对于答案的评价:相当感谢
;------------------------------------------------
其他回答 共 2 条
程序(略)
回答者: 一般般拉风 - 三级 2009-12-13 13:33
此题难点,恰在输出结果。
回答者: -------- 十四级 2009-12-13 17:45
;------------------------------------------------