汇编语言(十八)之求两个数的最大公约数

输入两个数,使用辗转相除法求最大公约数

程序运行:

 

代码:


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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值