;模块一,编写者:许荣仁,同组学生:徐飞鸿 EXTERN FUNCTION3:FAR,FUNCTION4:FAR .386 STACK SEGMENT USE16 PARA STACK'STACK' DB 200 DUP(0) STACK ENDS PRINTF MACRO STR1;9号功能调用输出字符串 PUSH DX PUSH AX LEA DX,STR1 MOV AH,9 INT 21H POP AX POP DX ENDM SCANF MACRO STR2;10号功能调用输入字符串 PUSH DX PUSH AX LEA DX,STR2 MOV AH,10 INT 21H POP AX POP DX ENDM DATA SEGMENT PARA PUBLIC USE16 'DATA' N EQU 3;N为学生人数 BNB DB 7;求平均成绩时除以7要用 BUF DB N DUP(0,0,0,0,0,0,0,0,0,'$',0,0,0,0);学生姓名及成绩 INAME DB 0AH,0DH,'Please input student name:$' IMSCR DB 0AH,0DH,'Please input MATH score:$' ICSCR DB 0AH,0DH,'Please input CHINESE score:$' IESCR DB 0AH,0DH,'Please input ENGLISH score:$' OP1 DB 0AH,0DH,'1--Input Students Name And Score$' OP2 DB 0AH,0DH,'2--Calculate Students Average Score$' OP3 DB 0AH,0DH,'3--Score Sort$' OP4 DB 0AH,0DH,'4--Output Students Score List$' OP5 DB 0AH,0DH,'5--Exit Program$' OCHO DB 0AH,0DH,'Please Choose Your Choice:$' ERRO DB 0AH,0DH,'CHOICE ERROR!$' INAMEE DB 10;暂存姓名 DB ? NAMM DB 10 DUP(0) ISCO DB 4;暂存成绩,最多3位数字+末位回车 DB ? ISCOR DB 0,0,0,0 CHOC DB 2;选择程序功能的变量 DB ? CHOICE DB 0,0 NOWA DB 0AH,0DH,'Now Is The ' SNUM DB '0' DB 'th Student$' SIGL DB 0;把输入的姓名串复制到指定位置时SIGL作循环判断条件 DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX PTMENU: PRINTF OP1 PRINTF OP2 PRINTF OP3 PRINTF OP4 PRINTF OP5 PRINTF OCHO SCANF CHOC CMP CHOICE,'1' JZ FUNC1 CMP CHOICE,'2' JZ FUNC2 CMP CHOICE,'3' JZ FUNC3 CMP CHOICE,'4' JZ FUNC4 CMP CHOICE,'5' JZ FUNC5 PRINTF ERRO JMP PTMENU FUNC1: MOV CX,N MOV BP,OFFSET BUF CALL FUNCTION1 JMP PTMENU FUNC2: MOV ESI,OFFSET BUF MOV CX,N CALL FUNCTION2 JMP PTMENU FUNC3: LEA SI,BUF MOV EBX,N CALL FUNCTION3 JMP PTMENU FUNC4: LEA BP,BUF MOV CX,N CALL FUNCTION4 JMP PTMENU FUNC5: MOV AH,4CH INT 21H ;功能1:录入学生姓名和各科考试成绩 ;入口参数:第一个学生起始地址--BP,学生人数--CX ;出口参数:无 FUNCTION1 PROC FAR PUSH EAX PUSH EBX PUSH ESI PUSH EDI MOV SI,BP MOV SNUM,'0' LOOPP: LEA DI,NAMM PRINTF NOWA PRINTF INAME MOV NAMM,0;把暂存姓名的内存区置为零,避免前一次输入对后一次输入的影响 MOV NAMM+1,0 MOV NAMM+2,0 MOV NAMM+3,0 MOV NAMM+4,0 MOV NAMM+5,0 MOV NAMM+6,0 MOV NAMM+7,0 MOV NAMM+8,0 MOV NAMM+9,0 SCANF INAMEE MOV EBX,0 MOV BL,INAMEE+1 MOV [BX+NAMM],0 MOV INAMEE+1,0 MOV BYTE PTR SIGL,0 LOOPC: MOV AL,[DI] MOV [SI],AL INC SI INC DI INC BYTE PTR SIGL CMP BYTE PTR SIGL,9 JNZ LOOPC INC SI PRINTF IMSCR SCANF ISCO CMP ISCO+1,3 JZ M100 CMP ISCO+1,2 JZ TwoNum MOV AL,ISCOR SUB AL,'0' MOV [SI],AL INC SI JMP INCHINESE TwoNum: MOV AX,0 MOV AL,ISCOR SUB AL,'0' IMUL AX,10 MOV AH,ISCOR+1 SUB AH,'0' ADD AL,AH MOV [SI],AL INC SI JMP INCHINESE M100: MOV [SI],BYTE PTR 100 INC SI INCHINESE: PRINTF ICSCR SCANF ISCO CMP ISCO+1,3 JZ C100 CMP ISCO+1,2 JZ CTwoNum MOV AL,ISCOR SUB AL,'0' MOV [SI],AL INC SI JMP INENG CTwoNum: MOV AX,0 MOV AL,ISCOR SUB AL,'0' IMUL AX,10 MOV AH,ISCOR+1 SUB AH,'0' ADD AL,AH MOV [SI],AL INC SI JMP INENG C100: MOV [SI],BYTE PTR 100 INC SI INENG: PRINTF IESCR SCANF ISCO CMP ISCO+1,3 JZ E100 CMP ISCO+1,2 JZ ETwoNum MOV AL,ISCOR SUB AL,'0' MOV [SI],AL INC SI JMP ONEEND ETwoNum: MOV AX,0 MOV AL,ISCOR SUB AL,'0' IMUL AX,10 MOV AH,ISCOR+1 SUB AH,'0' ADD AL,AH MOV [SI],AL INC SI JMP ONEEND E100: MOV [SI],BYTE PTR 100 INC SI ONEEND: ADD SI,1 INC BYTE PTR SNUM DEC CX CMP CX,0 JNZ LOOPP POP EDI POP ESI POP EBX POP EAX RET FUNCTION1 ENDP ;功能2计算平均分 ;入口参数:第一个学生开始的地址--ESI,学生人数--CX ;出口参数:无 FUNCTION2 PROC FAR PUSH EAX PUSH EDX XOR EAX,EAX GNT: MOV AL,BYTE PTR 10[ESI] SAL EAX,2 XOR EDX,EDX MOV DL,BYTE PTR 11[ESI] SAL EDX,1 ADD EDX,EAX XOR EAX,EAX MOV AL,BYTE PTR 12[ESI] ADD EAX,EDX XOR EDX,EDX DIV BNB MOV 13[ESI],AL ADD ESI,14 XOR EAX,EAX DEC CX JNZ GNT POP EDX POP EAX RET FUNCTION2 ENDP CODE ENDS END START