辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
汇编中的主要子程序
- ①主程序模块
- ②显示模块,调用DOS命令显示字符串,注意显示字符时要先将数值类型的数转化为字符类型
- ③辗转相除模块
代码(包括详细注释)
实验环境为MASM集成开发环境,win10DOSBOX
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
DATA SEGMENT X DW ? Y DW ? Z DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: CALL SHURU MOV X, BX CALL SHURU MOV Y, BX CALL GONGYUESHU MOV BX, Z CALL XIANSHI CALL GONGBEISHU JMP OUT1 SHURU: ; 输入数字到BX MOV BX, 0 S1: MOV AH, 1 INT 21H CMP AL, 0DH ; 输入是回车是结束 JZ EXIT AND AX, 000FH XCHG AX, BX MOV CX, 10 MUL CX ;之前输入的数乘以10 加上新输得数..比如123先是 0*10+1 ->1*10+2 ->12*10+3 ADD BX, AX JMP S1 EXIT: ;输入了回车 退出 MOV DL, 0AH ;换行 MOV AH, 2 INT 21H RET XIANSHI: ; 显示BX当中的数 MOV DL, 0AH ;换行 MOV AH, 2 INT 21H MOV AX, BX MOV BX, 10 MOV CX, 0 LET1: ;将要显示的数处以10 把余数入栈 MOV DX, 0 INC CX IDIV BX PUSH DX CMP AX, 0 ;余数为0时结束 JNZ LET1 LET2: POP AX ;将余数弹入 AX ADD AX, 3030H ;余数调整为ASC码 MOV DL, AL ;显示 MOV AH, 2 INT 21H LOOP LET2 RET GONGYUESHU: ;求 X 和 Y 的最大公约数..BX是除数 MOV BX, 1 SS1: MOV DX, 0 MOV AX, X DIV BX CMP DX, 0 JNZ SS2 ; 如果BX不能被X整除 BX不是公约数 跳到SS2 MOV DX, 0 MOV AX, Y DIV BX CMP DX, 0 JNZ SS2 ; 如果BX不能被Y整除 BX不是公约数 跳到SS2 MOV Z, BX ;如果既能被X整除又能被Y整除的值放到Z里面 SS2: ; BX加到等于被除数的时候跳出 ..否则除数加1..判断BX+1是不用公约数.. CMP BX, X INC BX JNZ SS1 RET GONGBEISHU: ;公倍数就是X乘Y在除以最大公约数... MOV AX, X MUL Y DIV Z MOV BX, AX CALL XIANSHI RET OUT1: MOV AH, 4CH INT 21H CODE ENDS END START |
效果: