输入两个数,使用辗转相除法求最大公约数
程序运行:
代码:
datas segment
M_max_len db 0ffh
M_len db 0
M_string db 100 dup(?)
M dw 0
N_max_len db 0ffh
N_len db 0
N_string db 100 dup(?)
N dw 0
inputM db 'input M=$'
inputN db 0dh,0ah,'input N=$'
output db 0dh,0ah,'R=$'
error_number db 0dh,0ah,'error number$'
datas ends
stacks segment stack
db 100h dup(?)
stacks ends
codes segment
assume cs:codes,ds:datas,ss:stacks
main proc far
start:
push ds
mov ax,0h
push ax
mov ax,datas ;初始化ds
mov ds,ax
;输入M提示
lea dx,inputM
mov ah,9
int 21h
;输入M
lea dx,M_max_len
mov ah,10
int 21h
;M转成十进制数
lea si,M_len
call translate_to_number
mov M,ax
;输入N提示
lea dx,inputN
mov ah,9
int 21h
;输入N
lea dx,N_max_len
mov ah,10
int 21h
;N转成十进制数
lea si,N_len
call translate_to_number
mov N,ax
;辗转相除法
mov ax,M
mov bx,N
cmp ax,0
jle no_plus
cmp bx,0
jle no_plus
s:
xor dx,dx
div bx
cmp dx,0
jz break
mov ax, bx
mov bx,dx
jmp s
;输出R结果
break:
lea dx,output
mov ah,9
int 21h
mov ax,bx
call decimal
jmp exit
;错误数据
no_plus:
lea dx,error_number
mov ah,9
int 21h
exit:
ret
main endp
;字符串转换为十进制数
translate_to_number proc near
;si:lenght first
push cx
push dx
push bx
push si
push di
mov di,10
mov ax,0
mov cl,[si]
mov ch,0
cmp cx,0
jz err
inc si
tran:
mov bl,[si]
inc si
cmp bl,'0'
jb err
cmp bl,'9'
ja err
sub bl,30h
xor bh,bh
mul di
add ax,bx
loop tran
jmp exit
err:
lea dx,error_number
mov ah,9
int 21h
mov ax,4c00h
int 21h
exit:
pop di
pop si
pop bx
pop dx
pop cx
ret
translate_to_number endp
;输出十进制数
decimal proc near
push ax
push cx
push dx
push bx
mov bx,ax
cmp ax,0
jge plus
mov dl,'-'
mov ah,2
int 21h
neg bx
mov ax,bx
plus:
mov cx,0
mov bx,10
de:
xor dx,dx
div bx
push dx
inc cx
cmp ax,0h
jnz de
de1:
pop dx
add dl,30h
mov ah,2
int 21h
loop de1
pop bx
pop dx
pop cx
pop ax
ret
decimal endp
codes ends
end main