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,然后和j用aaa调整相加,存回j。
3. 取乘数的高位和被乘数的低位,相乘,也一样做aam调整,存入k,将j的和k相加,结果存入k。做aaa调整。
4. 将乘数的高8位和被乘数的高位相乘,做aam调整,存入m,然后将k的高8位存入寄存器的低8位,对其调入的寄存器的高8位赋0,然后和m做add相加作aaa调整,结果存入m。至此,我们可以知道,i,k的低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