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