非压缩的bcd码表示的两位十进制运算

原创 2004年10月20日 07:02:00
;x*y/t并把结果存入u , u+1, u+2, u+3
data segment
 x dw 2 dup(?)
 y dw 2 dup(?)
 t db 1 dup(?)
 u db 1 dup(?)
 z dw 2 dup(?)
 i dw 2 dup(?)
 j dw 2 dup(?)
 k db 1 dup(?)
 m db 1 dup(?)
 n db 1 dup(?)
data ends
code segment
 assume cs:code , ds:data
start: 
 mov ax, data
 mov ds, ax
 
 mov x, 0908h
 mov y, 0302h
 mov t, 06h 
 
 mov cx, x
 mov dx, y
 
 mov al, cl
 mov bl, dl
 mul bl;x第一位相乘的结果
 aam
 mov z, ax;空出ax
 
 mov al, ch
 mul bl
 aam
 
 mov bx, z
 mov bl, bh
 mov bh, 0
 add ax, bx
 aaa
 ;*********************
 mov i, ax
 mov al, dh
 mov bl, cl
 mul bl;x第二位相乘的结果
 aam
 
 mov bx, i
 add ax, bx
 aaa
 mov i, ax
 ;**********************
 mov al, ch
 mov bl, dh
 mul bl;x第三位相乘的结果
 aam 
 
 mov bx, i
 mov bl, bh
 mov bh, 0
 add ax, bx
 aaa
 mov j, ax
 ;**********************
 ;除法
 mov al, ah
 mov ah, 0
 
 aad
 div t
 mov k, al;
 mov bh, ah
 mov ax, j
 mov ah, bh
 
 aad
 div t
 mov u, al;保存结果2
 mov bh, ah
 mov ax, i
 mov ah, bh
 
 aad
 div t
 mov n, al;
 mov bh, ah
 mov ax, z
 mov ah, bh
 
 aad
 div t
 mov m, al
 
 mov al, m
 mov ds:[0], al
 mov al, n
 mov ds:[1], al
 mov al, u
 mov ds:[2], al
 mov al, k
 mov ds:[3], al
 
 mov ah, 4ch
 int 21h
 
code ends
end  start


算法具体:

1.  其中对与第一道题目的算法,完全是自己琢磨出来的,算法的基本思想是这样的:对于一位的非压缩的BCD码我们可以很容易的得到结果,而对于二位BCD码,我们可以将其看作是四步这样的操作的组合,模拟乘法的计算过程:(所用变量不是程序的变量)

1.       aam调整个位的乘积结果,然后将结果存入一个数i,待用

2.       再将乘数的个位和被乘数高位按aam调整相乘,存入j,调出i的高8位,存入寄存器的低8位,对其调入的寄存器的高8位赋0,然后和jaaa调整相加,存回j

3.       取乘数的高位和被乘数的低位,相乘,也一样做aam调整,存入k,将j的和k相加,结果存入k。做aaa调整。

4.       将乘数的高8位和被乘数的高位相乘,做aam调整,存入m,然后将k的高8位存入寄存器的低8位,对其调入的寄存器的高8位赋0,然后和madd相加作aaa调整,结果存入m。至此,我们可以知道,ik的低8位保存的是结果的个位和十位,而m保存的是百位和千位。

以上是乘法的算法,下面是除法,也是同样的道理,我们用模拟方法:

1.  m的低8位的值,和t(除数)aad调整的除法,结果存入一个变量u,余数传入AH用于下一个运算。

2.  然后从m的低8位存入AL。进行运算,作aad调整。值存入v,余数传入AH用于下一个运算。

3.  然后从k的低8位存入AL。进行aad调整运算。值存入w,余数传入AH用于下一个运算。

4.  然后从i的低8位存入AL。进行aad调整运算。值存入x。得到结果uvwx组成的一组非压缩的BCD

压缩BCD码和非压缩BCD码的区别

BCD码:用四个二进制位表示一个十进制数字;最常用的是8421   BCD码;         压缩型BCD码:一个字节可存放一个两位十进制数,其中高四位存放十位数字,低四位存放个位数字。如:56的压...
  • zuoyanduxiaobo
  • zuoyanduxiaobo
  • 2009年06月18日 14:49
  • 9579

BCD与十进制转换的算法

BCD是指用二进制来表示十进制数的编码,即用4位二进制来表示一个十进制数,因此4位二进制数表示最大的十进制数9(1001),只取十六个数中的十个数(有别于8421码)。 为了表示两个十进制数(十...
  • simonjay2007
  • simonjay2007
  • 2014年06月13日 09:00
  • 18007

负数的BCD码表示

BCD码如何表示一个有符号数,如一个负数用BCD如何表示?  在STEP7中的16位BCD码格式是1位符号位+3位BCD码数值范围-999至+999;32位BCD码格式是1位符号位+7位BCD码数值...
  • zhangkongzhongyun
  • zhangkongzhongyun
  • 2014年08月06日 16:58
  • 5118

压缩BCD编码的Java实现

今天看到论坛的一个朋友问压缩BCD码的转换问题,正好下午没有事情,所以自己写了一个Java实现。首先转载一下BCD码的简单介绍。 BCD(Binary Coded Decimal)是用二进制编码表示的...
  • lcj8
  • lcj8
  • 2008年04月25日 14:17
  • 5821

关于BCD编码 BCD与十进制转换

BCD码(Binary-Coded Decimal‎)亦称二进码十进数或二-十进制代码。用4位二进制数来表示1位十进制数中的0~9这10个数码。是一种二进制的数字编码形式,用二进制编码的十进制代码。B...
  • cuisuqiang
  • cuisuqiang
  • 2014年11月13日 16:03
  • 1776

16进制 10进制 BCD码之间的转换

#include #include ///////////////////////////////////////////////////// // //功能:二进制取反 // /...
  • freedom2028
  • freedom2028
  • 2012年03月04日 17:24
  • 13830

PAT基础编程 5-4 BCD解密

5-4 BCD解密 (10分)BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD...
  • qq_32999795
  • qq_32999795
  • 2016年12月17日 23:11
  • 505

十六进制、BCD码与十进制之间的转换

Normal 0 7.8 磅 0 2 false false false MicrosoftIn...
  • lenyusun
  • lenyusun
  • 2010年03月05日 17:28
  • 15284

压缩BCD码转换成ASCII码

DSEG SEGMENT    BCD DB 86H   ASCII DB 2 DUP(0)DSEG ENDSCSEG SEGMENT   ASSUME CS:CSEG,DS:DSEGSTART:MO...
  • yunhaiC
  • yunhaiC
  • 2006年11月12日 16:15
  • 6363

5-4 BCD解密 (10分)

5-4 BCD解密 (10分) BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD...
  • qq_26570353
  • qq_26570353
  • 2016年04月02日 10:55
  • 2921
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:非压缩的bcd码表示的两位十进制运算
举报原因:
原因补充:

(最多只允许输入30个字)