汇编:四合一(阶乘、实时时间、最大随机数、结束)

—微机原理上机第一二两次小作业—
题目
产生拥有四个选项的列表,输入数字(1~4)执行列表内容:
1、输入数字X(0~9),实现X阶乘,并显示。
2、显示系统时间,格式:小时:分钟:秒,并实时更新。
3、产生50个随机数,查找并显示最大值的数值和位置。
4、退出程序。

结果展示:

  • 运行程序显示菜单
    在这里插入图片描述

  • 输入1执行计算X(0~9)的阶乘功能
    在这里插入图片描述

  • 输入2显示系统当前时间,并实时更新
    在这里插入图片描述

  • 输入3产生50个随机数并找到最大数及其位置
    在这里插入图片描述

  • 输入4退出程序
    在这里插入图片描述

程序如下:

STACK	SEGMENT STACK 'STACK'
		DW	100H DUP(?)
TOP		LABEL WORD
STACK	ENDS

DATA	SEGMENT
BUFFER LABEL WORD
    	X = 46
		IRP Y, <13, 23, 17, 19, 11>
		REPT 2
		IRP Z, <12, 34, 56, 78, 9>
		X = (X+Z) MOD Y
		DW X		;随机数字型
		ENDM
		ENDM
		ENDM
		
TABLE	DW SUB0, SUB1, SUB2, SUB3
STR1 	DB '1: Factorial of number n', 0AH, 0DH, '$'
STR2	DB '2: Show the time of system', 0AH, 0DH, '$'
STRi3	DB '3: Find the max of 50 random number', 0AH, 0DH, '$'
STR3	DB '4: EXIT', 0AH, 0DH, '$'
STR4	DB 'Please input 1~4 to perform the function:', '$'
STR5	DB 'Please input the number n(0~9):', '$'
STR6	DB 'The Factorial of number n:', '$'
STR7	DB 'Enter anykey to continue!', 0AH, 0DH, '$'
STR8	DB 'ENTER q to exit the disply of time', '$'
STR9	DB 'MAX Number:$'
STR0	DB 'Seat:$'
STRi9	DB '362880$'

DECIMAL DB 6 DUP(?)
DECIMAT DB 2 DUP(?)

DATA	ENDS

CODE	SEGMENT
		ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK
START:
		MOV AX, DATA
		MOV DS, AX
		MOV ES, AX
		MOV AX, STACK
		MOV SS, AX
		LEA SP, TOP
		
ST1:
		MOV AH, 00H
		MOV AL, 07H		;清屏
		INT 10H
		MOV AH, 9		;显示提示字符串
		CALL DISPMEUN
		MOV AH, 1		;输入一个字符
		INT 21H
		CALL DISPCR
		SUB AL, 31H		;10进制数字转ASCII
		JB ST1			;判断输入是否是数字
		CMP AL, 4
		JAE ST1			;大于4重新输入
		SHL AL, 1		
		XOR AH, AH
		MOV BX, AX
		MOV AL, 07H		;清屏
		INT 10H
		
		CALL TABLE[BX]
		JMP ST1
		MOV AH, 4CH
		INT 21H
		
		
    	MOV AH,4CH
    	INT 21H
    	
DISPCR	PROC NEAR
		PUSH AX
		PUSH DX
		MOV AH, 02
		MOV DL, 0DH
		INT 21H
		MOV DL, 0AH
		INT 21H
		POP DX
		POP AX
		RET
DISPCR 	ENDP

DISPB	PROC NEAR
		PUSH AX
		PUSH DX
		MOV AH, 02
		MOV DL, 20H
		INT 21H
		POP DX
		POP AX
		RET
DISPB 	ENDP

;左括号程序
DISPL	PROC NEAR
		PUSH AX
		PUSH DX
		MOV AH, 02
		MOV DL, 28H
		INT 21H
		
		POP DX
		POP AX
		RET
DISPL	ENDP

;右括号程序
DISPR	PROC NEAR
		PUSH AX
		PUSH DX
		MOV AH, 02
		MOV DL, 29H
		INT 21H
		POP DX
		POP AX
		RET
DISPR	ENDP

DISPMAO	PROC NEAR
		PUSH AX
		PUSH DX
		MOV AH, 02
		MOV DL, 3AH
		INT 21H
		POP DX
		POP AX
		RET
DISPMAO 	ENDP

;主菜单显示
DISPMEUN PROC NEAR
		PUSH DX
		LEA DX, STR1
		INT 21H
		LEA DX, STR2
		INT 21H
		LEA DX, STRi3
		INT 21H
		LEA DX, STR3
		INT 21H
		LEA DX, STR4
		INT 21H
		POP DX
		RET
DISPMEUN ENDP

SUB0 	PROC NEAR
		PUSH AX
		PUSH CX
		PUSH DX
		MOV AH, 9
		LEA DX, STR5	;显示字符串
		INT 21H
		MOV AH, 1		;输入一个字符
		INT 21H
		CALL DISPCR
		CMP AL, '9'
		JA SUB0
		JE NINEFAC
		CMP AL, '0'
		JB SUB0
		CMP AL, '0'
		JE ZEROFAC
		
		SUB AL, 30H		;ASCII转BCD
		MOV AH, 0
		MOV CL, AL
		MOV CH, 0
		MOV AL, 01H
		CALL FACTOR
		JMP THEEND
		
NINEFAC:
		MOV AH, 9
		LEA DX, STRi9	;显示字符串
		INT 21H
		CALL DISPCR
		JMP THEEND
		
ZEROFAC:
		MOV AH, 00H
		MOV AL, 01H
		CALL DISPLAY
		CALL DISPCR

THEEND:
		MOV AH, 9
		LEA DX, STR7
		INT 21H		
		MOV AH, 1
		INT 21H
		CALL DISPCR
		
		MOV AH, 00H
		MOV AL, 07H		;清屏
		INT 10H
		
		POP DX
		POP CX
		POP AX
		RET
SUB0 	ENDP

FACTOR 	PROC NEAR
		MUL CX
		LOOP FACTOR
		CALL DISPLAY
		CALL DISPCR
		
		RET
FACTOR 	ENDP

SUB1 	PROC NEAR
		PUSH AX
		PUSH CX
		PUSH DX
TIMES:
		MOV AH, 2CH
		INT 21H
		MOV AL, CH
		XOR AH, AH
		CALL DISPLAT
		CALL DISPMAO
		MOV AL, CL
		CALL DISPLAT
		CALL DISPMAO
		MOV AL, DH
		CALL DISPLAT
		CALL DISPCR
		
		IN AL, 60H
		CMP AL, 10H
		MOV AH, 9
		LEA DX, STR8	;显示字符串
		INT 21H
		
		CALL DELAY
		
		MOV AH, 00H
		MOV AL, 07H		;清屏
		INT 10H
		JNE TIMES
		
		;显示结束
		MOV AH, 9
		LEA DX, STR7
		INT 21H		
		MOV AH, 1
		INT 21H
		CALL DISPCR
		
		MOV AH, 00H
		MOV AL, 07H		;清屏
		INT 10H
		
		POP DX
		POP CX
		POP AX
		RET
SUB1	ENDP

DELAY PROC NEAR
		PUSH CX
		MOV CX, 0FFFFH
CDE:
		LOOP CDE
		POP CX
		RET
DELAY ENDP

		
SUB2	PROC NEAR
		PUSH AX
		PUSH BX
		PUSH CX
		PUSH DX
		
   		LEA SI, BUFFER
    	MOV CX, 50
    	DEC CX		;循环49次可找到最大值
    	MOV AX, [SI]	;缓冲区的第一个数
    	MOV DX, 1		;序号
    	CALL DISPLAT	;显示第一个数AX对应10进制数
    	CALL DISPL		;左括号
    	PUSH AX
    	MOV AX, DX
    	CALL DISPLAT	;显示第一个数序号
    	POP AX
    	CALL DISPR		;右括号
    	
L1:
		CMP AX, [SI+2]
		JAE L2
		MOV AX, [SI]
L2:
		ADD SI,2
		INC DX
		PUSH AX
		MOV AX, [SI]
		CALL DISPB		;显示空格
		CALL DISPLAT	;显示10进制
		CALL DISPL		
		PUSH AX
		MOV AX, DX
		CALL DISPLAT
		POP AX
		CALL DISPR
		POP AX
		LOOP L1
		
		CALL DISPCR		;换行
		;显示最大值结果和序号
		PUSH AX
		LEA DX, STR9	;显示第一个字符串
		MOV AH, 09H
		INT 21H
		
		POP AX
		CALL DISPLAT	;显示最大数值
		CALL DISPCR
		
		PUSH AX
		LEA DX, STR0 ;显示第二个字符串
		MOV AH, 09H
		INT 21H
		
		POP AX
		MOV BX, AX
		MOV AX, 1
		MOV CX, 50
		LEA SI, BUFFER
		
L4:
		CMP BX, [SI]
		JNE L3
		CALL DISPLAT
		CALL DISPB			;显示空格

L3:
		ADD SI, 2
		INC AX
		LOOP L4
		
		CALL DISPCR
		MOV AH, 9
		LEA DX, STR7
		INT 21H		
		MOV AH, 1
		INT 21H
		MOV AH, 00H
		MOV AL, 07H		;清屏
		INT 10H
		
		POP DX
		POP CX
		POP BX
		POP AX
		RET
SUB2	ENDP

SUB3	PROC NEAR
		PUSH AX
		MOV AH,4CH
    	INT 21H
		POP AX
		RET
SUB3	ENDP
		


DISPLAY PROC NEAR
		PUSH AX
		PUSH BX
		PUSH CX
		PUSH DX
		PUSH DI
		LEA DI, DECIMAL
		CALL TRANS16TO10	;16进制转换到10进制
		MOV CX, 6
		LEA DI, DECIMAL+5	;10进制数偏移地址指针归位到第一位
		MOV AH, 2			;INT 21H显示字符
		
DISPAXD2:
		MOV DL, [DI]
		ADD DL, 30H
		DEC DI
		INT 21H
		LOOP DISPAXD2		;循环5次显示510进制数(从高位到低位)
		POP DI
		POP DX
		POP CX
		POP BX
		POP AX
		RET
DISPLAY	ENDP

TRANS16TO10	PROC NEAR
		PUSH AX
		PUSH BX
		PUSH CX
		PUSH DX
		PUSH DI
		MOV BX,10
		MOV CX, 6
TRANS1:
		XOR DX, DX
		DIV BX				;16进制除10进制,留余数到DX(即存在DL中)
		MOV [DI], DL
		INC DI				;目的数指针加1,为了后续存储10进制数
		LOOP TRANS1			;循环5次,得到全部510进制
		POP DI
		POP DX
		POP	CX
		POP BX
		POP AX
		RET
TRANS16TO10 ENDP

DISPLAT PROC NEAR
		PUSH AX
		PUSH BX
		PUSH CX
		PUSH DX
		PUSH DI
		LEA DI, DECIMAT
		CALL TRANS16TT10	;16进制转换到10进制
		MOV CX, 2
		LEA DI, DECIMAT+1	;10进制数偏移地址指针归位到第一位
		MOV AH, 2			;INT 21H显示字符
		
DISPAXT2:
		MOV DL, [DI]
		ADD DL, 30H
		DEC DI
		INT 21H
		LOOP DISPAXT2		;循环5次显示510进制数(从高位到低位)
		POP DI
		POP DX
		POP CX
		POP BX
		POP AX
		RET
DISPLAT	ENDP

TRANS16TT10	PROC NEAR
		PUSH AX
		PUSH BX
		PUSH CX
		PUSH DX
		PUSH DI
		MOV BX,10
		MOV CX, 2
TRANT1:
		XOR DX, DX
		DIV BX				;16进制除10进制,留余数到DX(即存在DL中)
		MOV [DI], DL
		INC DI				;目的数指针加1,为了后续存储10进制数
		LOOP TRANT1			;循环5次,得到全部510进制
		POP DI
		POP DX
		POP	CX
		POP BX
		POP AX
		RET
TRANS16TT10 ENDP
   		 	
CODE	ENDS
    	END START

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值