BH 与 BL 中各存放着一个 2 位已组合十进制 BCD 数,求其乘积返回 DX。
返回 DX 也要变成 BCD 数。
题目链接:http://zhidao.baidu.com/question/937744321506414412.html
组合型(也称为压缩型)的BCD码,是不能直接做乘法运算的。
因为,在 8088/8086 指令系统中并没有这样的乘法指令。
可以采取的方法之一是:
先把 BCD 形式的乘数、被乘数都变换成二进制数,再用二进制的乘法指令,算出乘积。
按照题目要求,还要再把乘积变换成 BCD 码。
这种方法,并不简单。
另一个方法是:
循环累加。
利用乘数来控制循环次数,每一次循环,都把被乘数,加到乘积里面。
加的时候。还可以利用十进制调整指令,直接就把乘积,变成 BCD 码。
这种方法,比较简单。
做而论道利用第二种方法,编程如下。
ASSUME CS:CODE
CODE SEGMENT
START:
MOV BX, 1234H ;欲求:DX=12H*34H=0408H
;用 BH 控制循环,把 BL 内容累加
;----------------------------
MOV DX, 0
MOV CL, BH
AND CL, 0FH ;留下BH的个位
MOV CH, 0
LP1:
MOV AL, DL
ADD AL, BL
DAA
MOV DL, AL
MOV AL, DH
ADC AL, 0
DAA
MOV DH, AL
LOOP LP1
;----------------------------
MOV CL, 4
SHR BH, CL ;右移四位
MOV CL, BH ;留下BH的十位
MOV CH, 0
PUSH CX
MOV CL, 4
SHL BX, CL ;左移四位,乘以10
AND BX, 0FF0H ;留下BL*10
POP CX
LP2:
MOV AL, DL
ADD AL, BL
DAA
MOV DL, AL
MOV AL, DH
ADC AL, BH
DAA
MOV DH, AL
LOOP LP2
;----------------------------
;执行到此处,即得出:DX=0408H
MOV AH, 4CH
INT 21H
;----------------------------
CODE ENDS
END START
;----------------------------
提问者评价:谢谢!