从键盘输入两个十进制正整数(小于32767)求出他们的最小公倍数和最大公约数~~等待中~~~

时间:2023-01-01 19:02:39
同标题~~~
这个是我写的程序~~错误多多~~大家帮忙了~~~还有如何读入键盘数字呢?
data segment
buf  db  13,10 'input error ! $'
msg1 db  'one:$'
msg2 db  'two:$'
msg3 db  'result:$'
data ends
sseg segment stack
     dw  64dup(0)
sseg ends
code segment
     assume  cs:code,ds:data,es:data
start: mov ax,data
       mov ds,ax 
        lea ds,msg1
         mov ah,9
         int 21h  
         clc
        call read
         jc  err
       mov bx,ax
        lea dx, msg2
        mov ah,9
         int 21h
         clc
        call read
        jc  err
      call  maxgys
     mov bx,ax
mov  ah,9
int 21h
mov ax,bx
clc
call write
jmp exit
err: lea dx, buf
     mov ah, 9
     int  21h
      jmp exit 
maxgys  proc
        push  cx
        push  dx
        mov  dx,0
        div bx
        cmp dx,0
       jz l1
        mov  ax,bx
       mov  bx,dx
      call  maxgys
l1:  mov ax,bx
    pop dx
   pop cx
ret
write proc     
     MOV AH, 09H
     INT 21H
ret

2 个解决方案

#1


程序里面哪里有read呀,这里假设楼主从键盘上读入数的代码忘了给出!
data segment
buf  db  13,10 'input error ! $'
msg1 db  'one:$'
msg2 db  'two:$'
msg3 db  'result:$'
data ends
sseg segment stack
     dw  64dup(0)
sseg ends
code segment
     assume  cs:code,ds:data,es:data
start: mov ax,data
       mov ds,ax 
        lea dx,msg1;改
         mov ah,9
         int 21h  
         clc
        call read;假设这里已经读取了一个整数,在ax中
         jc  err
       mov bx,ax;保存到bx
        lea dx, msg2
        mov ah,9
         int 21h
         clc
        call read;假设这里已经读取了另一个整数,在ax中
        jc  err
         mov cx,ax;马上要乘法,所以先保存ax
         mov dx,0;清dx
         mul bx;用ax*bx,放在(dx,ax)中
         push dx;保存(dx,ax),以后要用。目前两个原始数据还在cx,bx中。
         push ax;
         mov ax,cx;
      jmp loop1;
    
err: lea dx, buf
     mov ah, 9
     int  21h
      jmp exit 
loop1:
        cmp bx,0;判断是否为0
        jz l1;如果为0则退出循环
        mov  dx,0;ax的扩展数据保存在(dx,ax)中
        div bx;        
        mov ax,bx;处理下一次循环用的被除数
        mov bx,dx;处理下一次循环用的除数
        mov dx,0;被除数ax的扩展
        jmp loop1        
l1:  mov bx,ax;退出循环时ax中保存的就是最大公约数,还要求最小公倍数,所以先保存到bx
    pop ax;回复以前保存的乘积(dx,bx)
    pop dx;
    div bx;用(dx,ax)除以bx,所得到的值就是最小公倍数,保存在ax中
    ;到此为止,最大公约数在bx中,最小公倍数在ax中
    ;以下是楼主的显示和写代码,没有清楚楼主如何用,故未写出。
mov bx,ax
mov  ah,9
int 21h
mov ax,bx
clc
call write
jmp exit
write proc     
     MOV AH, 09H
     INT 21H
ret

#2


算法思路:a,b两个数,重点在于求出最大公约数m,而最小公倍数n的求法是:n=(a*b)/m。


#1


程序里面哪里有read呀,这里假设楼主从键盘上读入数的代码忘了给出!
data segment
buf  db  13,10 'input error ! $'
msg1 db  'one:$'
msg2 db  'two:$'
msg3 db  'result:$'
data ends
sseg segment stack
     dw  64dup(0)
sseg ends
code segment
     assume  cs:code,ds:data,es:data
start: mov ax,data
       mov ds,ax 
        lea dx,msg1;改
         mov ah,9
         int 21h  
         clc
        call read;假设这里已经读取了一个整数,在ax中
         jc  err
       mov bx,ax;保存到bx
        lea dx, msg2
        mov ah,9
         int 21h
         clc
        call read;假设这里已经读取了另一个整数,在ax中
        jc  err
         mov cx,ax;马上要乘法,所以先保存ax
         mov dx,0;清dx
         mul bx;用ax*bx,放在(dx,ax)中
         push dx;保存(dx,ax),以后要用。目前两个原始数据还在cx,bx中。
         push ax;
         mov ax,cx;
      jmp loop1;
    
err: lea dx, buf
     mov ah, 9
     int  21h
      jmp exit 
loop1:
        cmp bx,0;判断是否为0
        jz l1;如果为0则退出循环
        mov  dx,0;ax的扩展数据保存在(dx,ax)中
        div bx;        
        mov ax,bx;处理下一次循环用的被除数
        mov bx,dx;处理下一次循环用的除数
        mov dx,0;被除数ax的扩展
        jmp loop1        
l1:  mov bx,ax;退出循环时ax中保存的就是最大公约数,还要求最小公倍数,所以先保存到bx
    pop ax;回复以前保存的乘积(dx,bx)
    pop dx;
    div bx;用(dx,ax)除以bx,所得到的值就是最小公倍数,保存在ax中
    ;到此为止,最大公约数在bx中,最小公倍数在ax中
    ;以下是楼主的显示和写代码,没有清楚楼主如何用,故未写出。
mov bx,ax
mov  ah,9
int 21h
mov ax,bx
clc
call write
jmp exit
write proc     
     MOV AH, 09H
     INT 21H
ret

#2


算法思路:a,b两个数,重点在于求出最大公约数m,而最小公倍数n的求法是:n=(a*b)/m。