汇编综合实验

汇编综合实验


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

  • 实验目的:熟练掌握和综合运用顺序结构、分支程序的结构、循环程序结构和子程序结构的编程方法;熟练掌握主程序与子程序之间的调用关系和参数传递方法。
  • 实验要求:利用汇编语言的综合程序结构编制程序
  • 实验内容:功能要求:
  • 功能一:进入时,设计密码输入验证功能;
  • 功能二:键盘输入全班同学( 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


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

posted @ 2019-10-24 18:15  野生的Lemon柠檬  阅读(979)  评论(0编辑  收藏  举报

呱呱呱呱呱🐸