这个是我写的程序~~错误多多~~大家帮忙了~~~还有如何读入键盘数字呢?
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
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
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。