—微机原理上机第一二两次小作业—
题目:
产生拥有四个选项的列表,输入数字(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次显示5位10进制数(从高位到低位)
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次,得到全部5位10进制
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次显示5位10进制数(从高位到低位)
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次,得到全部5位10进制
POP DI
POP DX
POP CX
POP BX
POP AX
RET
TRANS16TT10 ENDP
CODE ENDS
END START