;计算 a * b,其中a b的位数可以在 1 - 2^8 之间,默认位数为 50
;注意 a,b 必须为正数否则结果不正确
;******************************************************************
.model small
.const
MAX equ 50 ;乘数的最大位数
.data
a db MAX,MAX dup(0)
b db MAX,MAX dup(0)
r db MAX+MAX+1 dup(0)
txta db 'Enter a:$'
txtb db 'Enter b:$'
result db 'a * b = $'
enter db 13,10,'$'
.code
;------------------------------------------------------------------
;子程序,在屏幕上打印回车
;------------------------------------------------------------------
PtEnter proc near
mov dx,offset enter
mov ah,09h
int 21h
ret
PtEnter endp
;------------------------------------------------------------------
;在提示下输入数据,提示信息为 si ,数据输入到 di
;------------------------------------------------------------------
GetData proc near
mov dx,si
mov ah,09h
int 21h
mov dx,di
mov ah,0ah
int 21h
call PtEnter
ret
GetData endp
;------------------------------------------------------------------
;主过程
;------------------------------------------------------------------
main proc far
mov ax,@data
mov ds,ax
; 从键盘接收输入,注意这里没有对输入进行检查
mov si,offset txta
mov di,offset a
call GetData
mov si,offset txtb
mov di,offset b
call GetData
;准备从 a 中取数
mov si,offset a
inc si
mov ax,0
mov al,byte ptr[si]
mov byte ptr[si],0dh ;设置哨兵
add si,ax
;准备从 b 中取数
mov di,offset b
inc di
mov dx,0
mov dl,byte ptr[di]
mov byte ptr[di],0dh ;设置哨兵
add di,dx
;初始化结果 r
mov bx,offset r
add bx,ax
add bx,dx
inc bx
mov byte ptr[bx],'$'
dec bx
;开始计算
mov ch,10
scana: mov cl,byte ptr[si]
dec si
cmp cl,0dh
jz putout
sub cl,30h
push di
push bx
mov dx,0
scanb: mov al,byte ptr[di]
dec di
cmp al,0dh
jz next
sub al,30h
mul cl
add ax,dx
add al,byte ptr[bx]
div ch ;ch 里存的是10 计算时 ch 不变
mov dl,al ;商在 al 里作为下次计算的进位
mov byte ptr[bx],ah
dec bx
jmp scanb
; 最后的进位处理
next: cmp dl,0
jz dlzero
mov al,dl
mov byte ptr[bx],al
jmp dlnotzero
dlzero: inc bx
dlnotzero:mov dx,bx
pop bx
pop di
dec bx
jmp scana
putout: mov bx,dx
push bx
; 将结果转换为 ascii 码形式
nextr: mov al,byte ptr[bx]
cmp al,'$'
jz printr
add al,30h
mov byte ptr[bx],al
inc bx
jmp nextr
; 输出结果
printr: pop bx
mov dx,offset result
mov ah,09h
int 21h
mov dx,bx
mov ah,09h
int 21h
; 返回 DOS
mov ah,4ch
int 21h
main endp
end main
评论