汇编语言 | 输出两个数的最小公倍数和最大公约数

不想写解释了,很简单,大家自己看看。

.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

欢迎批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值