汇编综合实验
汇编综合实验代码书写思路
- 实验目的:熟练掌握和综合运用顺序结构、分支程序的结构、循环程序结构和子程序结构的编程方法;熟练掌握主程序与子程序之间的调用关系和参数传递方法。
- 实验要求:利用汇编语言的综合程序结构编制程序
- 实验内容:功能要求:
- 功能一:进入时,设计密码输入验证功能;
- 功能二:键盘输入全班同学( 35 人)的总成绩;
- 功能三:对全班同学的成绩进行从高到低的排名并在显示器上显示结果;
- 功能四:统计出不及格的人数并在显示器上输出。
- 功能五:统计并求出全班的平均成绩,在显示器上输出平均成绩。
实现思路:
- 1.首先整体构思,需要一个主函数,需要各个分函数
- 2.分函数有:① 密码验证,② 输入人数,③ 输入成绩,④ 计算总和,⑤ 统计不及格人数,⑥ 计算平均值,⑦ 输出显示
- 3.根据每一个分函数所需要的内容,再进行每一步的操作步骤
代码编译运行图:
实验代码:
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
- 有错误之处欢迎指出
- 如果有更好的思路请指教