编程语言

img hongweijin

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

发表于2004/10/20 7:02:00  3533人阅读

分类: Code Set

;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

阅读全文
0 0

相关文章推荐

img
取 消
img