📄 复件 xueshengchengji.asm
字号:
DATA SEGMENT
GRADE DW 50 DUP(?)
RANK DW 50 DUP(?)
N DB ?
BUF DB 'WELCOME !DO YOU WANT TO DO IT?(Y/N),ODH,OAH$'
BUF1 DB 'Please input the number of students of your class!,0dh,0ah$'
BUF2 DB 'Now,input the score of student follow the NO. of the student!$'
BUF3 DB 'The last result is:$'
DATA ENDS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CODE SEGMENT
ASSUME CS:CODE ,DS:DATA,ES:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AX,DATA
MOV ES,AX ;加载数据段
MAIN PROC FAR ;主函数
BEGIN: LEA DX,BUF
MOV AX,SEG BUF
CALL OUTBUF ;调用字符传输出函数
;CALL CRLF ;调用回车换行函数
MOV AH,01H
INT 21H
CMP AL,'N'
JE EXIT0 ;判断是否进入排序功能程序
CALL CRLF
LEA DX,BUF1 ;传BUF1偏移地址给DX
MOV AX,SEG BUF1 ;传BUF1段地址给AX
CALL OUTBUF
;CALL CRLF ;调用CRLF子程序,实现回车换行
CALL INNUM ;调用INNUM子程序,实现输入数据
MOV N,BL
CALL PRINT ;调用PTINT子程序,实现输入班级学生成绩
CALL CHANGE ;调用CHANGE子程序,实现对班级学生的班级名次的排列
CALL PRINTF ;调用PRINTF子程序,实现按学生学号输出班级名次
JMP BEGIN
EXIT0: MOV AH,4ch
INT 21h
MAIN ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PRINT PROC NEAR ;输入班级学生成绩函数
MOV BH,1 ;将1传送给BH
MOV AL,1
LEA SI,GRADE
PUSH DX
PUSH SI ;将GRADE数组偏移地址送入堆栈
REPEAT0: MOV [SI],AL ;在子单元的低字节存入学生学号
ADD SI,2 ;跳到下一个字单元
INC AL
CMP AL,N
JBE REPEAT0 ;循环存入学生的学号,从1号开始递加到N
LEA DX,BUF2
MOV AX,SEG BUF2
CALL OUTBUF ;输出字符数组BUF2
CALL CRLF
POP SI
POP DX
INC SI ;使SI指向字单元的高字节
REPEAT1: CALL INNUM ;输入一个两位数学生成绩
MOV [SI],BL ;将输入学生的成绩存入该学生学号的所在字节单元的下一个字节单元,即存入字单元的高字节
ADD SI,2 ;跳到下一个字节单元
INC BH
CMP BH,N
JBE REPEAT1 ;循环存入N位学生的成绩
RET
PRINT ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CHANGE PROC NEAR ;名次处理函数
MOV CL,N
DEC CL
NEXT: LEA SI,GRADE
MOV DL,N
NEXT1: DEC DX
MOV AX,[SI] ;第一个人的学号及成绩传给AX
MOV BX,[SI+2] ;第二个人的学号及成绩传给BX
CMP DX,0
JE EXIT
ADD SI,2 ;偏移地址自加,取下一个存储单元
CMP AH,BH
JAE NEXT1 ;如果AH>=BH,继续循环,否则交换AX,BX
XCHG AX,BX ;交换AX,BX
MOV [SI-2],AX ;将较好成绩的学生学号及成绩存在上一个存储单元
MOV [SI],BX ;将较差成绩的学生学号及成绩存在下一个存储单元
JMP NEXT1 ;继续循环,直到DX为零,跳出循环,成绩最差的一名学生学号及成绩放在最后一个存储单元
EXIT: LOOP NEXT ;循环排序,实现将学生学号和成绩字单元按学生成绩由高到低排列
MOV CL,N
LEA SI,GRADE
INC SI
MOV BL,1
PUSH AX
PUSH CX
MOV CH,0
NEXT2: MOV CL,[SI]
MOV [SI],BL
ADD SI,2
INC CH
CMP CH,N
JE P2
CMP [SI],CL
JE NEXT2
INC BL
LOOP NEXT2 ;将学生成绩单元存入该学生的班级名次,按成绩由高到低存入1~N
P2: MOV CL,N
DEC CL
POP CX
POP AX
NEXT3: LEA SI,GRADE
MOV DL,N
NEXT4: DEC DX
MOV AX,[SI]
MOV BX,[SI+2]
CMP DX,0
JE EXIT2
ADD SI,2
CMP AL,BL ;比较学生学号
JB NEXT4 ;实现按将学号大的学生及名次移到最后一个学生数组单元
XCHG AX,BX
MOV [SI-2],AX
MOV [SI],BX
JMP NEXT4
EXIT2: LOOP NEXT3 ;循环排序,实现将学生学号和名次字单元按学生成绩由低到高排列
LEA SI,GRADE
LEA DI,RANK
MOV CL,N
REP MOVSW ;将按学号排序好的学生学号和名次数组内容传给RANK数组
RET
CHANGE ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PRINTF PROC NEAR ;名次输出函数,实现按学生学号输出名次
PUSH DX
PUSH AX
LEA DX,BUF3
MOV AX,SEG BUF3
CALL OUTBUF
CALL CRLF
POP DX
POP AX
LEA SI,RANK
INC SI
MOV CL,N
PUSH AX
PUSH BX
MOV AX,0
P1: XOR AX,AX
MOV AL,[SI]
CMP AL,9
JBE P4
MOV BL,10D
DIV BL
MOV BH,AH
MOV DL,AL
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,BH
ADD DL,30H
INT 21H ;实现名次输出
CALL CRLF ;回车换行
JMP P7
P4: MOV DL,AL
ADD DL,30H
MOV AH,02H
INT 21H
CALL CRLF
P7: ADD SI,2
LOOP P1 ;循环输出学生名次
POP BX
POP AX
RET
PRINTF ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CRLF PROC NEAR ;回车换行函数,实现回车换行
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
RET
CRLF ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OUTBUF PROC NEAR ; 输出字符数组函数
MOV DS,AX
MOV AH,09H
INT 21H
RET
OUTBUF ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INNUM PROC NEAR ;数据输入函数
MOV BL,0
REPEAT5: MOV AH,01H
INT 21H
CMP AL,0DH
JZ P3
SUB AL,30H
XCHG AL,BL
MOV CX,10
MUL CL
XCHG AL,BL
ADD BL,AL
JMP REPEAT5
P3: CALL CRLF
RET
INNUM ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -