因为DX:AX除以一个16位数,得到的商放在AX,余数放在DX,由于32位除以16位数商可能超过16位,会出现divide overflow,所以我给限定在0~655350之间,这样的话最大655350/10=65535=FFFF也保持在16位之内(显示10进制要除10取余显示)
ps::解决的办法不是没有,可以自己写个子过程专用来做除法(减法代替除法)
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
data segment
MUL1 db 36H,35H,34H,32H,31H 被乘数
COUNT1 equ $-MUL1
end1 db '$'
MUL2 db 38H 乘数
COUNT2 equ $-MUL2
end2 db '$'
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov dx,offset MUL1
mov ah,9
int 21h
mov dl,'*'
mov ah,2
int 21h
mov dx,offset MUL2
mov ah,9
int 21h
mov dl,'='
mov ah,2
int 21h
mov si,offset MUL1 装载第一个数放到ax
mov cx,COUNT1
call LoadValue
mov ax,dx
mov si,offset MUL2 装载第二个数放到bx
mov cx,COUNT2
call LoadValue
mov bx,dx
mul bx
call ShowInt 显示32位数
mov ah,4ch
int 21h
显示DX:AX表示的32位整数
入口: dx:ax 待显示的整数(0~655350)
ShowInt proc near
push dx
push cx
push bx
push ax
pushf
and dx,0fh
mov cx,6 0~655350最多6位
mov bx,0ah
lp_si:
div bx
push dx 得到的是低到高位,要改下顺序显示出来
mov dx,0
loop lp_si
mov cx,6 开始输出
lp_sis:
pop dx
add dl,30h
mov ah,2
int 21h
loop lp_sis
popf
pop ax
pop bx
pop cx
pop dx
ret
ShowInt endp
字节中的数字装入寄存器
入口: si 数字字节的起始地址
cx 数字位数
出口: dx 数值
LoadValue proc near
push si
push cx
push bx
push ax
pushf
xor bx,bx
lp_lv:
xchg ax,bx
mov dx,0ah
mul dx
xchg bx,ax
and ax,0
mov al,byte ptr[si]
sub al,30h
add bx,ax
inc si
loop lp_lv
mov dx,bx
popf
pop ax
pop bx
pop cx
pop si
ret
LoadValue endp
code ends
end start
结果在3-4位,最小为100,最大为9801,规定均以四位表示如100显示为0100data segment
msg_input db 'input two numbers:$'
msg_result db 'the result:$'
x dw ?运算时的中转站
y dw ?
data ends
code segment
assume cs:code,ds:data
main proc near
start:
mov ax,data
mov ds,ax
mov dx,offset msg_input
mov ah,09h
int 21h
call crlf
--接收数字并作乘法运算,将最终结果存放于bx寄存器中--
call decibin
call crlf
mov x,bx
call decibin
call crlf
mov ax,bx
mul x
mov bx,ax
-----------------------------------------------
mov dx,offset msg_result
mov ah,09h
int 21h
call crlf
call bini显示结果
mov ah,4ch
int 21h
ret
main endp
-----------------接收数字的子程序--------------
decibin proc near
mov bx,0
newchar:
mov ah,1
int 21h
sub al,30h
jl exit
cmp al,9d
jg exit
cbw
xchg ax,bx
mov cx,10d
mul cx
xchg ax,bx
add bx,ax
jmp newchar
exit:
ret
decibin endp
-----------将数字输出的子程序---------------
bini proc near
mov cx,1000d
call bin
mov cx,100d
call bin
mov cx,10d
call bin
mov cx,1d
call bin
ret
bini endp
bin proc near
mov ax,bx
mov dx,0
div cx
mov bx,dx
mov dl,al
add dl,30h
mov ah,02h
int 21h
ret
bin endp
----------------------------------------------
---------------回车换行子程序-----------------
crlf proc near
mov dl,0dh
mov ah,02h
int 21h
mov dl,0ah
mov ah,02h
int 21h
ret
crlf endp
----------------------------------------------
code ends
end start
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)