80x86 汇编语言:组合 BCD 码的乘法


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

;----------------------------


提问者评价:谢谢!


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值