不想写解释了,很简单,大家自己看看。
.MODEL SMALL
.DATA
M WORD 123
N WORD 5
RESULT WORD ?
CHANGELINE DB 13,10,'$'
MESS2 BYTE"lowest common multiple is: ",'$'
MESS1 BYTE"greatest common divisor is: ",'$'
.STACK 4096
.CODE
MAIN PROC FAR
MOV AX,@DATA
MOV DS,AX
MOV AX,M
MOV BX,N
CALL GCD;最大公约数
MOV DX,OFFSET MESS1
MOV AH,09H
INT 21H
MOV AX,RESULT
CALL PRINT
MOV DX,OFFSET CHANGELINE
MOV AH,09H;输出换行
INT 21H
CALL LCM;最小公倍数
MOV AX,RESULT
CALL PRINT
MOV DX,OFFSET CHANGELINE
MOV AH,09H;输出换行
MOV AX,4C00H
INT 21H
MAIN ENDP
GCD PROC NEAR;最大公约数
CMP AX,BX
JZ NEXT;相等则跳转,cmp相等令zf=1
JA GREAT;大于则跳转
XCHG AX,BX
GREAT:;辗转相除
XOR DX,DX;清空DX
DIV BX;余数放DX,商放AX
AND DX,DX ;若dx=0,zf=1
JZ NEXT;zf=1跳转
MOV AX,BX
MOV BX,DX
JMP GREAT
NEXT:MOV RESULT,BX
RET
GCD ENDP
LCM PROC NEAR;最小公倍数与最大公约数乘积=两数相乘
CALL GCD
MOV CX,RESULT
MOV AX,M
MOV BX,N
MUL BX;AX与BX相乘,保存在AX中
XOR DX,DX;清空DX
DIV CX;除以最大公约数,余数放DX,商放AX
MOV RESULT,AX
MOV DX,OFFSET MESS2
MOV AH,09H
INT 21H
RET
LCM ENDP
PRINT PROC NEAR ; 输出带符号的ax
PUSH AX
TEST AX,8000H
JNS P1;sf不为1跳转,即无符号
PUSH AX
PUSH DX;保存现场
MOV AH,2
MOV DL,'-'
INT 21H
POP DX
POP AX
NEG AX;求补
P1:
CALL PRINT2
POP AX
RET
PRINT ENDP
PRINT2 PROC NEAR; 输出无符号的ax
PUSH AX;保存现场
PUSH BX
PUSH CX
PUSH DX
PUSHF;保存标志位
XOR CX,CX;zf=1
MOV BX,10
P1:;存余数
XOR DX,DX;zf=1
DIV BX
INC CX
ADD DX,30H
PUSH DX ;保存DX入栈,后续
CMP AX,0
JNE P1;不等于零则跳转
MOV AH,2
P2:;输出栈内所存数字
POP DX
INT 21H
LOOP P2
;MOV DL,32
;INT 21H
POPF
POP DX
POP CX
POP BX
POP AX
RET
PRINT2 ENDP
END
欢迎批评指正。