题目要求
根据欧几里德辗转相除法,求两个已定义好的字M、N(均为正整数)的最大公约数,步骤为:
①求M/N的余数R;
②如果R=0,则N为最大公约数,退出循环;
③用N更新M的值,用R更新N的值;
④重复①~③步。
将M、N和最大公约数展示出来。
运行截图
编程平台
Masm for Windows 集成实验环境 2012.5
代码实现
DATAS SEGMENT
M DW 120
N DW 25
hintM DB 'M: $'
hintN DB 'N: $'
result DB 'The maximum number of conventions is: $'
break DB 13,10,'$';换行
scale DW 10;以十进制形式输出数据
DATAS ENDS
STACKS SEGMENT STACK
DB 200H DUP(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
MAIN PROC
MOV AX,DATAS
MOV DS,AX
LEA DX,hintM;输出M前的提示
MOV AH,9H
INT 21H
MOV AX,M
CALL OUTPUTDATA;输出M
LEA DX,break;换行
MOV AH,9H
INT 21H
LEA DX,hintN;输出N前的提示
MOV AH,9H
INT 21H
MOV AX,N
CALL OUTPUTDATA;输出N
LEA DX,break;换行
MOV AH,9H
INT 21H
LEA DX,result;输出结果提示
MOV AH,9H
INT 21H
;实现欧几里德辗转相除法
MOV AX,M;AX存放被除数
MOV BX,N;BX存放除数
lop:
MOV DX,0
DIV BX
CMP DX,0;余数是否为0
JE finish
MOV AX,BX;除数变成被除数
MOV BX,DX;余数变成除数
JMP lop
finish:
MOV AX,BX
CALL OUTPUTDATA;输出最大公约数
MOV AH,4CH
INT 21H
MAIN ENDP
;子程序
;功能:以scale进制形式输出正整数。
;入口参数:AX存放要输出的正整数,scale存放进制数。
OUTPUTDATA PROC
MOV BX,scale
MOV SI,0;记录输出的位数
lop1:
MOV DX,0
DIV BX
PUSH DX;余数入栈
INC SI
CMP AX,0
JNE lop1
lop2:
POP DX
ADD DL,30H;转换成ASCII码
MOV AH,2H
INT 21H
DEC SI
CMP SI,0
JNE lop2
RET
OUTPUTDATA ENDP
CODES ENDS
END MAIN
如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!