• 汇编综合实验


    汇编综合实验


    汇编综合实验代码书写思路

    • 实验目的:熟练掌握和综合运用顺序结构、分支程序的结构、循环程序结构和子程序结构的编程方法;熟练掌握主程序与子程序之间的调用关系和参数传递方法。
    • 实验要求:利用汇编语言的综合程序结构编制程序
    • 实验内容:功能要求:
    • 功能一:进入时,设计密码输入验证功能;
    • 功能二:键盘输入全班同学( 35 人)的总成绩;
    • 功能三:对全班同学的成绩进行从高到低的排名并在显示器上显示结果;
    • 功能四:统计出不及格的人数并在显示器上输出。
    • 功能五:统计并求出全班的平均成绩,在显示器上输出平均成绩。

    实现思路:

    • 1.首先整体构思,需要一个主函数,需要各个分函数
    • 2.分函数有:① 密码验证,② 输入人数,③ 输入成绩,④ 计算总和,⑤ 统计不及格人数,⑥ 计算平均值,⑦ 输出显示
    • 3.根据每一个分函数所需要的内容,再进行每一步的操作步骤

    代码编译运行图:

    photo1

    photo2


    实验代码:

    
    DATA	SEGMENT
    
    	PASSWD		DB	'123456$'			;预设密码
    	LEN1		EQU	$-PASSWD		;密码串长度
    	WELCOME	DB	'Please input password: $'	;输入密码语句
    	TRUE		DB	'Pass !$'
    	FALSE		DB	'Password Fail !','$'
    	TIP_OF_INPUT	DB	'Please input number of student: $'	;提示输入学生人数
    	TIP		DB	'Input Score of Student: $'	;提示输入学生
    	STR_OF_STU	DB	256	DUP('$')		;存放学生人数
    	STR		DB	512	DUP('$')		;学生成绩存放
    	PASS		DB	256	DUP('$')		;输入密码位置
    	STR_SCORE	DB	'The student score is $'
    	SCORE		DW	50	DUP(0)
    	SUM		DW	0
    	STR_AVE1	DB	'AVE1= $'
    	AVE1		DW	0
    	STR_AVE2	DB	'AVE2= $'
    	AVE2		DW	0
    
    	STR_UNPASS	DB	'Student unpass number: $'
    	SCO_FAIL		DW	0
    
    	STUDENT_NUMBER	DW	5
    
    	DIVI		DW	10000,1000,100,10,1
    	RESULT		DB	'00000$'
    
    DATA	ENDS
    
    CODE	SEGMENT
    	ASSUME	DS:DATA,CS:CODE
    START:
    	
    MAIN	PROC
    	MOV	AX,DATA
    	MOV	DS,AX
    	MOV	ES,AX
    	XOR	BX,BX
    ;------------------------------------------------------比较密码
    	CALL	CMPASSWD		;输入密码
    	CMP	DX,0
    	JZ	EXIT			;判断密码是否正确
    	MOV	DX,OFFSET	TRUE
    	MOV	AH,09H
    	INT	21H
    	CALL	BACKSPACE
    ;----------------------------------------密码正确之后
    	CALL		INPUT_STUDENT_NUMBER		;输入学生人数
    
    	CALL		INPUT		;输入
    	CALL		SUMP		;计算总和
    	CALL		AVERAGE		;计算平均值
    	CALL		UNPASS		;计算不及格人数
    	CALL		BUBBLE		;冒泡算法
    	CALL		OUTPUTALL	;输出	
    	
    EXIT:	
    	MOV	AH,4CH
    	INT	21H
    
    MAIN	ENDP
    ;==========================程序段
    CMPASSWD		PROC
    	
    ;----------------------------------------输入密码段
    AGAIN:	
    	LEA	DX,WELCOME
    	MOV	AH,09H
    	INT	21H
    
    	LEA	DX,PASS
    	MOV	AH,0AH
    	INT	21H
    	LEA	SI,PASSWD
    	LEA	DI,PASS+2
    	CALL	BACKSPACE
    ;--------------------------------------------
    	
    	MOV	CX,LEN1-1
    	CLD
    	REPZ	CMPSB
    	JNZ	NPAIR
    	MOV	DL,[DI+1]
    	CMP	DL,'$'		
    	JNZ	NPAIR
    	MOV	DX,1
    	RET
    NPAIR:	
    	INC	BX
    ;--------------------------------------------
    	PUSH 	CX
    	PUSH	BX
    	PUSH	SI
    	LEA	SI,PASS
    	MOV	CX,255
    	MOV	BX,'$'
    CLEAR:
    	MOV	[SI],BX
    	INC	SI	
    	LOOP	CLEAR		
    	POP	SI
    	POP	BX
    	POP	CX
    ;-------------------------------------恢复段
    	CMP	BX,3
    	JNZ	AGAIN
    
    	MOV	DX,OFFSET	FALSE
    	MOV	AH,09H
    	INT	21H
    	MOV	DX,0	
    	RET
    CMPASSWD	ENDP	
    ;*****************************************以上是密码输入判断段
    INPUT_STUDENT_NUMBER	PROC
    	XOR	BX,BX
    	XOR	SI,SI
    	MOV	DX,OFFSET	TIP_OF_INPUT
    	MOV	AH,09H
    	INT	21H
    	MOV	DX,OFFSET	STR_OF_STU
    	MOV	AH,0AH
    	INT	21H
    	
    	MOV	DL,'$'	
    	LEA	SI,STR_OF_STU+2
    	XOR	AX,AX
    	
    AG:
    	MOV		CH,'0'
    	CMP		[SI],CH
    	JB			RRR
    	MOV		CH,'9'
    	CMP		[SI],CH
    	JA			RRR
    	
    	MOV	BL,BYTE	PTR	[SI]
    	SUB	BX,48
    	MOV	DH,10
    	IMUL	DH
    	ADD	AX,BX
    
    RRR:
    	INC	SI
    	CMP	DL,[SI]
    	JZ	EXIT2
    	JMP	AG
    EXIT2:
    	MOV	STUDENT_NUMBER,AX
    	CALL	BACKSPACE
    	RET
    INPUT_STUDENT_NUMBER	ENDP
    ;++++++++++++++++++++++++以上是输入学生人数段
    INPUT		PROC
    	MOV		DX,OFFSET	TIP
    	MOV		AH,09H
    	INT		21H
    	
    	LEA		DX,STR		;计算偏移量,放入STR中储存
    	MOV		AH,0AH		;进行输入
    	INT		21H
    
    	LEA		SI,STR+2		;定位字符串								
    
    	MOV		DH,'$'		;这里要判断字符串
    ;结尾
    	MOV		DL,' '		; bx 中放置空格,dx中	
    					;放置钱符号
    	XOR		AX,AX
    	XOR		CX,CX
    	XOR		DI,DI
    LOP:
    			
    	CMP		DH,[SI]		;如果到达了字符串结尾,那么结束
    	JZ		BREAK
    	
    	CMP		DL,[SI] 		;如果是空格符号,继续进行加一
    	JNZ		OP1
    	
    	MOV		SCORE[DI],AX
    	ADD		DI,2
    	XOR		AX,AX
    	JMP		CONTINUE
    ;要不然就判断是否是0-9,如果是,执行以下操作
    ;-------------------------
    OP1:
    	
    	MOV		CH,'0'
    	CMP		[SI],CH
    	JB			CONTINUE
    	MOV		CH,'9'
    	CMP		[SI],CH
    	JA			CONTINUE
    ;以上判断是否是0-9之间的内容,如果是,那么就进行以下内容,如果不是,指针加一
    ;------------------
    	MOV		AH,10
    	IMUL		AH
    	MOV		CL,[SI]						;[SI]移去CL中
    	SUB		CL,48								;用CL中的内容减去48
    	ADD		AL,CL 						;AL原来有的数值加上CL中的内容
    CONTINUE:
    	INC		SI
    	JMP		LOP
    
    BREAK:
    		MOV		SCORE[DI],AX		;???
    		RET
    
    INPUT		ENDP
    
    ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^以上是数据输入转换段
    SUMP		PROC
    	XOR		AX,AX
    	XOR		BX,BX
    	XOR		CX,CX
    	XOR		DX,DX
    
    	MOV		DX,STUDENT_NUMBER	;这里为什么不能用
    	MOV		SI,0
    
    COUNT:
    	ADD		AX,SCORE[SI]
    	ADD		SI,2
    	DEC		DX
    	CMP		DX,0
    	JNZ		COUNT
    
    	MOV		SUM,AX
    
    	RET
    SUMP		ENDP
    ;#######################以上是计总和段
    BUBBLE	PROC
    	XOR	AX,AX
    	XOR	BX,BX
    	XOR	CX,CX
    	XOR	DX,DX
    	XOR	SI,SI
    	XOR	DI,DI
    	MOV	SI,0
    
    	MOV	CX,STUDENT_NUMBER
    ;	MOV	CX,30			;输入人数
    
    	DEC	CX
    OUTER:
    	MOV	AX,SCORE[SI]
    	PUSH		CX
    	MOV	DI,SI
    INNER:
    	ADD	DI,2
    	MOV	DX,SCORE[DI]
    	CMP	AX,DX
    		;	JLE	CONT
    	JAE	CONT
    	XCHG	AX,DX	;交换两个值,AX和DX
    	MOV	SCORE[SI],AX
    	MOV	SCORE[DI],DX
    CONT:
    	LOOP	INNER
    	POP	CX
    	ADD	SI,2
    	LOOP	OUTER
    ;基本思想:CX作为循环,内外层都是CX进行循环,第一循环n次,第二次循环n-i次
    	RET
    BUBBLE	ENDP
    ;@@@@@@@@@@@@@@@@@@以上是排序段
    AVERAGE		PROC
    	XOR		AX,AX
    	XOR		BX,BX
    	XOR		CX,CX
    	XOR		DX,DX
    	MOV		AX,SUM
    
    	MOV		CX,STUDENT_NUMBER
    ;	MOV		CX,3			;需要修改人数
    
    	IDIV		CX			
    	MOV		AVE1,AX
    	MOV		AVE2,DX
    	
    	RET
    AVERAGE		ENDP
    ;&&&&&&&&&&&&&&&&&&&&以上是求解均值段
    UNPASS	PROC
    	XOR	BX,BX
    	MOV	SI,0
    
    ;	MOV	CX,30	;人数
    	MOV	CX,STUDENT_NUMBER
    
    CC:
    	CMP		SCORE[SI],60
    	JAE		LP	;60分以下的分数
    	INC		BX
    LP:
    	ADD	SI,2
    	LOOP	CC
    	
    	MOV	SCO_FAIL,BX
    	RET
    UNPASS	ENDP
    ;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''以上是计算不及格人数
    ;----如果是负数,那么输出负号,如果不是,输出正数
    
    OUTPUTAX	PROC
    ;东西放在AX中,输出AX中的内容
    	CMP	AX,0
    	JGE	GO
    	PUSH	AX
    	MOV	DX,'-'
    	MOV	AH,02H
    	INT	21H
    	POP	AX
    	NEG	AX
    	
    GO:	MOV	SI,OFFSET	DIVI
    	MOV	DI,OFFSET	RESULT
    	MOV	CX,5
    AA:
    	MOV	DX,0
    	DIV	WORD	PTR	[SI]
    	ADD	AL,48
    	MOV	BYTE	PTR	[DI],AL
    	INC	DI
    	ADD	SI,2
    	MOV	AX,DX
    	LOOP	AA
    	MOV	CX,4
    	MOV	DI,OFFSET	RESULT
    BB:
    	CMP	BYTE	PTR	[DI],'0'
    	JNE	PRINT
    	INC	DI
    	LOOP	BB
    PRINT:
    	MOV	DX,DI
    	MOV	AH,09H
    	INT	21H
    	MOV	DX,' '
    	MOV	AH,02H
    	INT	21H
    
    	RET
    OUTPUTAX	ENDP
    ;#######################以上是十进制输出显示,放在BX当中
    OUTPUTALL	PROC
    	;首先输出学生平均值
    	;然后输出不通过的学生人数
    	;最后输出所有学生成绩		
    
    	MOV	CX,STUDENT_NUMBER
    
    	MOV	SI,0
    	CALL	BACKSPACE
    DISPLAY:
    	PUSH	CX
    	XOR	AX,AX
    	MOV	AX,SCORE[SI]
    	PUSH	SI
    	CALL	OUTPUTAX
    	POP	SI
    	ADD	SI,2
    	
    	MOV	DX,' '
    	MOV	AH,02H
    	INT	21H
    	POP	CX
    	LOOP	DISPLAY		;输出学生成绩
    
    	CALL	BACKSPACE
    ;.....................................................................................输出学生所有成绩
    	MOV	DX,OFFSET	STR_UNPASS
    	MOV	AH,09H
    	INT	21H
    	MOV	AX,SCO_FAIL
    	CALL	OUTPUTAX
    	CALL	BACKSPACE
    ;..........................................................................输出学生不及格人数
    	MOV	DX,OFFSET	STR_AVE1
    	MOV	AH,09H
    	INT	21H
    	MOV	AX,AVE1
    	CALL	OUTPUTAX
    	CALL	BACKSPACE	
    
    	MOV	DX,OFFSET	STR_AVE2
    	MOV	AH,09H
    	INT	21H
    	MOV	AX,AVE2
    	CALL	OUTPUTAX
    	CALL	BACKSPACE	
    ;...............................................................................以上输出平均值		
    	RET
    OUTPUTALL	ENDP
    ;~~~~~~~~~~~~~~~~~~~输出所有
    
    BACKSPACE	PROC
    	PUSH	AX
    	PUSH	DX
    	
    	MOV	DX,0DH
    	MOV	AH,02H
    	INT	21H
    	MOV	DX,0AH
    	MOV	AH,02H
    	INT	21H	
    
    	POP	DX
    	POP	AX
    	RET
    BACKSPACE	ENDP
    
    ;===========================程序代码段
    
    CODE	ENDS
    	END	START
    
    
    ;功能一:实现密码验证
    ;功能二:实现输入35人的总成绩
    ;功能三:对全班同学的成绩从高到低排序并显示输出
    ;功能四:统计不及格人数并显示输出
    ;功能五:求出全班平均成绩并显示输出
    
    ;STR_SCORE	DB	'The student score is $'
    ;STR_AVE1	DB	'AVE1= $'
    ;STR_AVE2	DB	'AVE2= $'
    ;STR_UNPASS	DB	'Student unpass number: $'
    ;SCO_FAIL	DB	0
    
    

    • 有错误之处欢迎指出
    • 如果有更好的思路请指教

    这是小睿的博客,如果需要转载,请标注出处啦~ヾ(≧▽≦*)o谢谢。
  • 相关阅读:
    [Linux] VIM Practical Note
    [JAVA] JAVA 文档注释
    [JAVA] JAVA 类路径
    [JAVA] JAVA JDK 安装配置
    [Dynamic Language] Python定时任务框架
    [DataBase] MongoDB (8) 副本集
    [DataBase] MongoDB (7) MongoDB 索引
    [DabaBase] MongoDB (6) 启动、停止、相关系统配置及安全性设置
    [Dynamic Language] 用Sphinx自动生成python代码注释文档
    [JAVA] java class 基本定义 Note
  • 原文地址:https://www.cnblogs.com/Yunrui-blogs/p/11733916.html
Copyright © 2020-2023  润新知