汇编乘法

汇编乘法,第1张

这个程序还有点Bug,就是乘出来的数显示范围是0~655350

因为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显示为0100

data 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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11523544.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存