用十六位乘法指令完成三十二位无符号数乘法
丑陋的中国人-鞭炮的来历
用十六位乘法指令完成三十二位无符号数乘法
一、要求:以十六进制格式输入
乘数和被乘数,以十
六进制格式显示结果,两个数相乘(十六进制
数输入,十六进制数输出)<
br>
二、设计原理
实现两个32位无符号数的相乘,被乘数在DX和AX寄存器
中,乘数
在CX和BX寄存器中,最后的64位乘积在DX,CX,BX,AX中。
三、设计流程图
四、程序代码
ddata segment
w1 dw 4 dup(0)
;定义4字存放两个32位乘法因子,地址低位存放数据高位
w2 dw 4 dup(0)
;定义4字存放运算结果,乘法结果高位存放在RES低位
D5 db '
(H)','$$'
D1 db 'Please Input the number1 :
','$$'
D2 db 'Please Input the number2 :
','$$'
D3 db 'Get the result : number1 *
number2 = ','$$'
D4 db 0dh,0ah,'$$'
ddata ends
sstack segment para stack
'stack' 定义堆栈段
sta dw 100 dup(?)
top label word
sstack ends
ccode segment
;定义代码段
assume cs:ccode,ds:ddata
main
proc far 主程序开始
start: mov ax,sstack
mov ss,ax
mov sp,offset top
push
ds
mov ax,0 将ax清零
push ax
mov ax,ddata 将DDATA的段地址送入ds
mov ds,ax
;初始化结束
call en
mov dx,offset D1
mov ah,9
int 21h
mov
bx,offset w1
call read 存放输入数据
call
h 显示[H]
call en 回车,换行
mov dx,offset D2 显示提示信息
mov ah,9
;在屏幕上输出字符串D2
int 21h 中断调用
add bx,4
call read 存放输入数据
call h
call en
call en
mov dx,offset D3
;显示提示信息
mov ah,9
int 21h
;实现32位乘法
call mult
mov bx,offset w2
call dispall 调用子程序输出结果
mov
ah,10h
int 16h
int 10h
call h
call en
call en
ret
main endp 相乘
mult proc
push
ax
push bx
push cx
push dx
push di
mov ax,offset w2
mov di,ax DI指向RES偏移地址
mov bx,offset w1
;BX指向乘法因子首地址
mov ax,[bx+6]
;D1第48位以后,被乘数的低16位
mov cx,[bx+2]
;D1第16位以后,乘数的低16位
mul cx
;32位乘法,结果存在DX,AX中
add [di+6],ax
;低16位乘法结果储存在RES高32位
add [di+4],dx
mov ax,[bx+4] D1第32位以后,被乘数的高16位与乘数低16位相乘
mul cx CX不变,存放乘数低16位
add
[di+4],ax 移位加法
adc [di+2],dx 带进位加法
mov cx,[bx] 乘数的高16位
mov
ax,[bx+6] 被乘数低16位
mul cx 16位乘法
add [di+4],ax 移位加法
adc [di+2],dx
;带进位加法
adc word ptr[di],0
mov
ax,[bx+4] 被乘数高16位
mul cx
;CX内容为乘数高16位,高16位乘法
add [di+2],ax 移位加法
adc [di],dx 带进位加法
pop di
pop dx
pop cx
pop bx
pop
ax
ret
mult endp 回车,换行
en
proc
push ax
push dx
mov
dx,offset D4
mov ah,9
int 21h
pop dx
pop ax
ret
en endp
h proc
push ax
push dx
mov dx,offset D5
mov ah,9
int 21h
pop dx
pop ax
ret
h
endp 显示入口bx
dispall proc
push cx
push bx
mov cx,4
l1:
push cx
mov cl,8
mov ax,[bx]
add bx,2
call print
pop cx
loop l1
pop bx
pop cx
ret
dispall endp 入口 bc 存放读入数据
read proc
push cx
push ax
push dx
mov dx,0
mov ch,8
next1: cmp
ch,4
jnz n2
push ax
push dx
mov dl,' '
mov ah,2
int 21h
pop dx
pop ax
n2: mov ah,7
int 21h
cmp al,13
je over
push dx
mov dl,al
call check 调用CHECK,将输入字符转换为数据存储
mov cl,al
cmp cl,0
jnz next2
pop dx
jmp next1
next2: mov ah,2
int 21h
mov al,cl
pop dx
cmp ch,4
jnz full
mov
[bx],dx
mov dx,0
full: mov cl,4
rol dx,cl
add dl,al
dec ch
jnz next1
over: mov [bx+2],dx 结束
pop dx
pop ax
pop cx
ret
read endp
check proc
;检查输入数据是数字还是字母,转换为ASC码存储
cmp al,30h
;比较得出是数字还是字母
jl er
cmp al,3ah
jnl b1
sub al,30h 将数字转换成ASC码
jmp ok
b1: cmp al,41h
jl er
cmp al,47h
jnl b2
sub al,37h
;将字母转换成ASC码
jmp ok
b2: cmp
al,61
jl er
cmp al,67h
jnl
er
sub al,57h
jmp ok
er:
mov al,0h
ok: ret
check endp 入口ax
print proc
push cx
push bx
mov bx,ax
mov ch,4
next: mov cl,4
rol bx,cl
;移位相与,屏蔽低位,得到要输出的ASC码
mov al,bl
and al,0fh
add al,30h
cmp al,3Ah
jl disp
add
al,7
disp: mov ah,2
mov dl,al
int 21h
dec ch
jnz next
pop bx
pop cx
mov dl,' '
mov ah,2
int 21h
ret
print endp
ccode ends
end start
五、运行结果
用十六位乘法指令完成三十二位无符号数乘法
一、要求:以十六进制
格式输入乘数和被乘数,以十
六进制格式显示结果,两个数相乘(十六进制
数输入,十六进制数
输出)
二、设计原理
实现两个32位无符号数的相乘,被乘数在DX和A
X寄存器中,乘数
在CX和BX寄存器中,最后的64位乘积在DX,CX,BX,AX中。
三、设计流程图
四、程序代码
ddata segment
w1 dw 4 dup(0)
;定义4字存放两个32位乘法因子,地址低位存放数据高位
w2 dw 4 dup(0)
;定义4字存放运算结果,乘法结果高位存放在RES低位
D5 db '
(H)','$$'
D1 db 'Please Input the number1 :
','$$'
D2 db 'Please Input the number2 :
','$$'
D3 db 'Get the result : number1 *
number2 = ','$$'
D4 db 0dh,0ah,'$$'
ddata ends
sstack segment para stack
'stack' 定义堆栈段
sta dw 100 dup(?)
top label word
sstack ends
ccode segment
;定义代码段
assume cs:ccode,ds:ddata
main
proc far 主程序开始
start: mov ax,sstack
mov ss,ax
mov sp,offset top
push
ds
mov ax,0 将ax清零
push ax
mov ax,ddata 将DDATA的段地址送入ds
mov ds,ax
;初始化结束
call en
mov dx,offset D1
mov ah,9
int 21h
mov
bx,offset w1
call read 存放输入数据
call
h 显示[H]
call en 回车,换行
mov dx,offset D2 显示提示信息
mov ah,9
;在屏幕上输出字符串D2
int 21h 中断调用
add bx,4
call read 存放输入数据
call h
call en
call en
mov dx,offset D3
;显示提示信息
mov ah,9
int 21h
;实现32位乘法
call mult
mov bx,offset w2
call dispall 调用子程序输出结果
mov
ah,10h
int 16h
int 10h
call h
call en
call en
ret
main endp 相乘
mult proc
push
ax
push bx
push cx
push dx
push di
mov ax,offset w2
mov di,ax DI指向RES偏移地址
mov bx,offset w1
;BX指向乘法因子首地址
mov ax,[bx+6]
;D1第48位以后,被乘数的低16位
mov cx,[bx+2]
;D1第16位以后,乘数的低16位
mul cx
;32位乘法,结果存在DX,AX中
add [di+6],ax
;低16位乘法结果储存在RES高32位
add [di+4],dx
mov ax,[bx+4] D1第32位以后,被乘数的高16位与乘数低16位相乘
mul cx CX不变,存放乘数低16位
add
[di+4],ax 移位加法
adc [di+2],dx 带进位加法
mov cx,[bx] 乘数的高16位
mov
ax,[bx+6] 被乘数低16位
mul cx 16位乘法
add [di+4],ax 移位加法
adc [di+2],dx
;带进位加法
adc word ptr[di],0
mov
ax,[bx+4] 被乘数高16位
mul cx
;CX内容为乘数高16位,高16位乘法
add [di+2],ax 移位加法
adc [di],dx 带进位加法
pop di
pop dx
pop cx
pop bx
pop
ax
ret
mult endp 回车,换行
en
proc
push ax
push dx
mov
dx,offset D4
mov ah,9
int 21h
pop dx
pop ax
ret
en endp
h proc
push ax
push dx
mov dx,offset D5
mov ah,9
int 21h
pop dx
pop ax
ret
h
endp 显示入口bx
dispall proc
push cx
push bx
mov cx,4
l1:
push cx
mov cl,8
mov ax,[bx]
add bx,2
call print
pop cx
loop l1
pop bx
pop cx
ret
dispall endp 入口 bc 存放读入数据
read proc
push cx
push ax
push dx
mov dx,0
mov ch,8
next1: cmp
ch,4
jnz n2
push ax
push dx
mov dl,' '
mov ah,2
int 21h
pop dx
pop ax
n2: mov ah,7
int 21h
cmp al,13
je over
push dx
mov dl,al
call check 调用CHECK,将输入字符转换为数据存储
mov cl,al
cmp cl,0
jnz next2
pop dx
jmp next1
next2: mov ah,2
int 21h
mov al,cl
pop dx
cmp ch,4
jnz full
mov
[bx],dx
mov dx,0
full: mov cl,4
rol dx,cl
add dl,al
dec ch
jnz next1
over: mov [bx+2],dx 结束
pop dx
pop ax
pop cx
ret
read endp
check proc
;检查输入数据是数字还是字母,转换为ASC码存储
cmp al,30h
;比较得出是数字还是字母
jl er
cmp al,3ah
jnl b1
sub al,30h 将数字转换成ASC码
jmp ok
b1: cmp al,41h
jl er
cmp al,47h
jnl b2
sub al,37h
;将字母转换成ASC码
jmp ok
b2: cmp
al,61
jl er
cmp al,67h
jnl
er
sub al,57h
jmp ok
er:
mov al,0h
ok: ret
check endp 入口ax
print proc
push cx
push bx
mov bx,ax
mov ch,4
next: mov cl,4
rol bx,cl
;移位相与,屏蔽低位,得到要输出的ASC码
mov al,bl
and al,0fh
add al,30h
cmp al,3Ah
jl disp
add
al,7
disp: mov ah,2
mov dl,al
int 21h
dec ch
jnz next
pop bx
pop cx
mov dl,' '
mov ah,2
int 21h
ret
print endp
ccode ends
end start
五、运行结果