记一次汇编作业

mac2024-03-26  55

记一次汇编的作业----一个超级简易的成绩管理系统

DATAS SEGMENT ;此处输入数据段代码 GRADE DW 10 DUP(?) SCREEN DB “Welcome to Student System”,10,13 DB “1.Insert Students Grades”,10,13 DB “2.Find Students Grades BY NUM”,10,13 DB “3.Find Average Score”,10,13 DB “4.The Number of Failing”,10,13 DB “5.Caculate Failing Rate”,10,13 DB “6.Find the Highest Score And Lowest Score”,10,13 DB “7.Change A Student`Grade”,10,13,’ ′ S T R 1 D B " I N P U T 10 N U M B E R S ' STR1 DB "INPUT 10 NUMBERS STR1DB"INPUT10NUMBERS" STR2 DB “RESULTS”,10,13,’ ′ S T R 3 D B " A V E R A G E I S " , 10 , 13 , ′ ' STR3 DB "AVERAGE IS",10,13,' STR3DB"AVERAGEIS",10,13,’ STR4 DB “FAILING NUM IS “,10,13,’ ′ S T R 5 D B " F A I L I N G R A T E I S " , 10 , 13 , ′ ' STR5 DB "FAILING RATE IS ",10,13,' STR5DB"FAILINGRATEIS",10,13,’ STR6 DB “THE HIGHEST IS And Lowest Score”,10,13,’ ′ S T R 7 D B " I N P U T A N U M T O F I N D ' STR7 DB "INPUT A NUM TO FIND STR7DB"INPUTANUMTOFIND”,10,13,’ ′ S T R 9 D B " W H I C H N U M B E R G R A D E U W A N T T O C H A N G E " , 10 , 13 , ′ ' STR9 DB "WHICH NUMBER GRADE U WANT TO CHANGE",10,13,' STR9DB"WHICHNUMBERGRADEUWANTTOCHANGE",10,13,’ STR10 DB “INPUT A GRADE TO CHANGE TO”,10,13,’ ′ S T R 8 D B " C O N T I N U E ( Y / N ) ? ' STR8 DB "CONTINUE(Y/N)? STR8DB"CONTINUE(Y/N)?” DATAS ENDS

STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS

CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX FIRST: CALL CLEAN_SCREEN CALL SHOW_WELCOME MOV AH,8 INT 21H SUB AL,30H JMP CHOOSE

CHOOSE: ;对想要调用的功能进行选择 C1: CMP AL,1 JNZ C2 LEA DX,STR1 MOV AH,9 INT 21H CALL INPUT_SCORE CALL CONTINUE C2: CMP AL,2 JNZ C3 LEA DX,STR7 MOV AH,9 INT 21H CALL SHOW_SCORE CALL CONTINUE C3: CMP AL,3 JNZ C4 LEA DX,STR3 MOV AH,9 INT 21H CALL CACULATE_AVG CALL CONTINUE C4: CMP AL,4 JNZ C5 LEA DX,STR4 MOV AH,9 INT 21H CALL FAIL CALL CONTINUE C5: CMP AL,5 JNZ C6 LEA DX,STR5 MOV AH,9 INT 21H CALL CACULATE_FAIL CALL CONTINUE C6: CMP AL,6 JNZ C7 LEA DX,STR6 MOV AH,9 INT 21H CALL Show_HIGHEST_LOWEST CALL CONTINUE C7: CMP AL,7 JNZ EXIT CALL CHANGE_SCORE CALL CONTINUE EXIT:;结束地点 MOV AH,4CH INT 21H SHOW_WELCOME PROC;显示欢迎界面 LEA DX,SCREEN MOV AH,9 INT 21H RET SHOW_WELCOME ENDP CLEAN_SCREEN PROC;清除屏幕 MOV AH,6 MOV AL,0 MOV BH,07H MOV CH,0 MOV CL,0 MOV DH,24 MOV DL,79 INT 10H MOV DH,0;把光标移至0,0 MOV DL,0 MOV BH,0 MOV AH,2 INT 10H RET CLEAN_SCREEN ENDP INPUT_SCORE PROC;输入成绩 LEA DX,STR4 MOV AH,9 INT 21H MOV SI,0 ENTER_1: MOV BX,0;输入一个成绩(2位数) MOV CX,2;进行两次循环来获取二位数成绩 MOV DX,10 S: MOV AH,1 INT 21H XOR AH,AH SUB AL,30H ;转为数值(ASCII-30H=十进制) CBW XCHG AX,BX MOV DX,10 MUL DX ADD BX,AX LOOP S ;循环结束后BX存放输入的数据 MOV GRADE[SI],BX ;写入成绩到GRADE ADD SI,2 MOV AH,2 MOV DL,20H ;显示一个空格 INT 21H CMP SI,20 JB ENTER_1 RET INPUT_SCORE ENDP SHOW_SCORE PROC;根据所给的学号进行查询 LEA DX,STR2 MOV AH,9 INT 21H MOV AH,8 INT 21H MOV CX,1 SUB AL,30H XOR AH,AH SHL AX,1;让SI乘2,使SI移到想要显示的地址 MOV SI,AX MOV DX,GRADE[SI] MOV AX,DX

CALL SHOW RET

SHOW_SCORE ENDP CACULATE_FAIL PROC MOV AX,0 MOV SI,0 AGAIN: CMP GRADE[SI],60;通过比较,把不及格的人数放在AX JNB COUNT INC AX COUNT: ADD SI,2;向后移2 CMP SI,20 ;计算不及格人数 JB AGAIN MOV BL,10 SUB BL,AL MOV AL,BL ;得到及格人数,人数10人。 XOR AH,AH CALL SHOW MOV DL,“0” MOV AH,2 INT 21H MOV DL,"%";转换为百分制 MOV AH,2 INT 21H RET CACULATE_FAIL ENDP SHOW PROC NEAR;将AX的值按ASCII进制 MOV CL,10 XOR AH,AH DIV CL MOV DL,AL ADD DL,30H MOV DH,AH MOV AH,02H INT 21H MOV DL,DH ADD DL,30H MOV AH,02H INT 21H RET SHOW ENDP CONTINUE PROC;判断程序是否要继续执行 LEA DX,STR8 MOV AH,9 INT 21H MOV AH,8H MOV BL,‘Y’ INT 21H CMP BL,AL JZ FIRST JMP EXIT CONTINUE ENDP Show_HIGHEST_LOWEST PROC;获得最高分和最低分 MOV AX,0 MOV CX,9 MOV SI,0 MOV AX,GRADE[SI] CONTINUE0:;对值进行比较 CMP AX,GRADE[SI+2] JA NEXT MOV AX,GRADE[SI+2] NEXT: DEC CX ADD SI,2;后移,取下一个数 CMP CX,0 JNZ CONTINUE0 CALL SHOW ;显示最高分 MOV DL,20H MOV AH,2 INT 21H MOV AX,GRADE[20] CALL SHOW ;显示最低分 RET Show_HIGHEST_LOWEST ENDP CACULATE_AVG PROC MOV AX,0 MOV CX,10 MOV SI,0 AGAIN: ADD AX,GRADE[SI] ADD SI,2 LOOP AGAIN MOV CL,10 DIV CL;把累加的结果除以10,得到平均分

CALL SHOW ;显示 RET

CACULATE_AVG ENDP FAIL PROC ;不及格人数 MOV DL,0DH MOV AH,2 INT 21H MOV DL, 0AH MOV AH, 2 INT 21h LEA BX,GRADE MOV CX,10 MOV DX,0 NEXT: MOV AX,DS:[BX] CMP AX,60;进行与60比较,若不小于60,则不进行自加 JA A INC DX A: INC BX INC BX LOOP NEXT ADD DX,30H MOV AH,2 INT 21H RET FAIL ENDP CHANGE_SCORE PROC LEA DX,STR9 MOV AH,9 INT 21H MOV AH,8 INT 21H MOV CX,1 SUB AL,30H XOR AH,AH SHL AX,1 MOV SI,AX;获得目标所对应的的地址 LEA DX,STR10 MOV AH,9H INT 21H MOV CX,2 S0: MOV AH,1 INT 21H XOR AH,AH SUB AL,30H ;转为数值 CBW XCHG AX,BX MOV DX,10 MUL DX ADD BX,AX LOOP S0 ;循环结束后BX存放输入的数据 ADD BX,60;调整数值,并存入对应的地址中 MOV GRADE[SI],BX

RET

CHANGE_SCORE ENDP CODES ENDS END START

最新回复(0)