📄 source.asm
字号:
data SEGMENT
a DW 50 DUP(?)
b DW 50 DUP(?)
grade DB 'please input the grade:$'
wrong1 DB 'wrong,input again:$'
CHuan DB 'xuehaoshi:$chengjishi:$mingcishi:$'
count1 DW ?
count2 DW ?
memory1 DW ?
memory2 DW ?
memory3 DW ?
data ENDS
code SEGMENT
main PROC FAR
ASSUME CS:code,DS:data
MOV AX,data
MOV DS,AX
LEA DX,grade
MOV AH,9
INT 21h
CALL DECibin
CALL compare
MOV AH,1
INT 21h
MOV AX,4c00h
INT 21h
main ENDP
crlf PROC NEAR ;回车换行
MOV AH,02
MOV DL,0dh
INT 21h
MOV DL,0ah
INT 21h
RET
crlf ENDP
wrong2 PROC NEAR ;输入错误时提示
LEA DX,wrong1
MOV AH,09
INT 21h
RET
wrong2 ENDP
xuehao PROC NEAR
LEA DX,CHuan
MOV AH,09
INT 21h
RET
xuehao ENDP
CHengji PROC NEAR
LEA DX,CHuan+11
MOV AH,09
INT 21h
RET
CHengji ENDP
mingci PROC NEAR
LEA DX,CHuan+23
MOV AH,09
INT 21h
RET
mingci ENDP
SPp PROC NEAR ;输出空格
MOV AH,02
MOV DL,20h
INT 21h
RET
SPp ENDP
binidec PROC NEAR ;将bx中的十进制数转化并且输出到显示器
MOV CX,100d
CALL DEC_div
MOV CX,10d
CALL DEC_div
MOV CX,1
CALL DEC_div
RET
binidec ENDP
DEC_div PROC NEAR ;将bx中的十进制数转化并且输出到显示器
MOV AX,BX
MOV DX,0
DIV CX
MOV BX,DX
MOV DL,AL
ADD DL,30h
MOV AH,02
INT 21h
RET
DEC_div ENDP
DECibin PROC NEAR ;输入学生成绩到缓冲区a和b中并且得到实际输入的成绩个数在cx中
MOV CX,50d
MOV BX,0
LEA SI,a
LEA DI,b
NEwchar:
MOV AH,1
INT 21h
CMP AL,0dh
JZ exit
CMP AL,2ch
JZ another
SUB AL,30h
JL wrong
CMP AL,09
JG wrong
CBW
PUSH CX
XCHG AX,BX
MOV CX,10d
MUL CX
ADD BX,AX
POP CX
JMP NEwchar
wrong:
CALL wrong2
XOR BX,BX
JMP NEwchar
another:CMP BX,100d
JA wrong
MOV [SI],BX
MOV [DI],BX
MOV DX,BX
ADD SI,2
ADD DI,2
MOV BX,0
LOOP NEwchar
exit:
MOV [SI],BX
MOV [DI],BX
CALL crlf
MOV BX,51d
NEG CX
ADD CX,BX ;得到实际输入的成绩个数在cx中
RET
DECibin ENDP
compare PROC NEAR ;比较排名并且输出
LEA SI,a
MOV count1,CX ;保存内循环次数
MOV BX,1
LOOP1:MOV AX,[SI]
MOV count2,CX ;保存外循环次数
PUSH BX ;保存学号
MOV BX,1 ;尚未比较时将此学生排名置1
MOV CX,count1
LEA DI,b
LOOP2:
CMP AX,[DI]
JL calculate
ADD DI,2
LOOP LOOP2
JMP shuchu
calculate:INC BX ;得到某学生排名在bx中
ADD DI,2
LOOP LOOP2
shuchu:MOV memory1,AX ;保存成绩
MOV memory2,BX ;保存名次
POP BX
MOV memory3,BX ;学号
CALL xuehao
CALL binidec ;输出学号
CALL SPp
CALL CHengji
MOV BX,memory1 ;输出成绩
CALL binidec
CALL SPp
CALL mingci
MOV BX,memory2 ;输出名次
CALL binidec
CALL crlf
ADD SI,2
MOV BX,memory3
ADD BX,1
MOV CX,count2
LOOP LOOP1
RET
compare ENDP
code ENDS
END main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -