📄 4.asm
字号:
DATA SEGMENT
GRADE DW 50 DUP(?)
RANK DW 50 DUP(?)
COUNT DW ?
MEG1 DB 'GRADE? $'
MEG2 DB 0DH,0AH,'INPUT ERROR!',0DH,0AH,'$'
MEG3 DB 'RANK: $'
MEG4 DB 0DH,0AH,'$'
DATA ENDS
STACK SEGMENT STACK
DB 100 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA ;定义数据段
MOV DS,AX
CALL INPUT ;调用INPUT模块
CALL RANKP ;调用RANKP模块
CALL OUTPUT ;调用OUTPUT模块
OVER:
MOV AH,4CH
INT 21H
;----------INPUT显示输入模块------------------
INPUT PROC NEAR
MOV DX,OFFSET MEG1 ;传入显示输入信息的有效地址
MOV AH,9
INT 21H
MOV SI,0 ;指针置0
MOV COUNT,0 ;计数器初始置0
INPUTS:
CALL DECIBIN ;调用DECIBIN (10-2)
INC COUNT ;计数器加1
CMP DL,',' ;判断数之间的','间隔
JE STORE
CMP DL,13 ;判断回车
JE I_EXIT
JNE ERROR ;DL!=','时(不与,为间隔)产生错误
STORE:
MOV GRADE[SI],BX ;将成绩存储在GRADE中
ADD SI,2 ;指针加2
JMP INPUTS ;跳转,循环输入
ERROR:
MOV DX,OFFSET MEG2 ;传入显示错误信息的有效地址
MOV AH,9
INT 21H
JMP OVER ;出现错误时直接结束
I_EXIT:
MOV GRADE[SI],BX ;将最后一个成绩存储在GRADE中
CALL NEWLINE ;调用NEWLINE
RET
INPUT ENDP ;该模块结束
;----------RANKP传入数组模块------------------
RANKP PROC NEAR
MOV DI,COUNT ;将录入的学生个数传入DI
MOV BX,0 ;基址变址置0
LP:
MOV AX,GRADE[BX] ;将传入的成绩暂时放入AX待做比较
MOV WORD PTR RANK[BX],1;名次初始置1
MOV CX,COUNT ;将总数传入计数寄存器
LEA SI,GRADE ;传入成绩数组的地址
R_NEXT:
CMP AX,[SI] ;AX与其他数进行比较
JNB CONTINUE ;有符号比较转移(大于或等于)
INC WORD PTR RANK[BX];名次加1(比较完后再加1)
CONTINUE:
ADD SI,2 ;指针加2,指向下一个要与AX比较的数
LOOP R_NEXT ;重复比较
ADD BX,2 ;存储名次的位置变址加2
DEC DI ;计数DI减1
JNE LP ;DI不为0时继续循环
RET
RANKP ENDP ;该模块结束
;----------OUTPUT显示结果模块------------------
OUTPUT PROC NEAR
MOV DX,OFFSET MEG3 ;传入显示名次信息的有效地址
MOV AH,9
INT 21H
MOV DI,COUNT ;将录入的学生个数传入DI
MOV SI,0 ;指针置0
O_NEXT:
MOV BX,RANK[SI]
CALL BINIDEC ;调用显示的子程序BINIDEC
ADD SI,2 ;指针加2
DEC DI ;计数DI减1
JZ O_EXIT ;等0时退出
MOV DL,','
MOV AH,2 ;显示
INT 21H
JNZ O_NEXT ;DI不为0时继续循环
O_EXIT:
CALL NEWLINE ;调用NEWLINE
RET
OUTPUT ENDP ;该模块结束
;----------DECIBIN模块10转2------------------
DECIBIN PROC NEAR
MOV BX,0
CHANGE:
MOV AH,1
INT 21H
MOV DL,AL
SUB AL,30H
JL D_EXIT ;小于时退出
CMP AL,9D
JG D_EXIT ;大于时退出
CBW ;字节换字
XCHG AX,BX
MOV CX,10
MUL CX
XCHG AX,BX ;交换
ADD BX,AX
JMP CHANGE
D_EXIT:
RET
DECIBIN ENDP ;该模块结束
;----------BINIDEC模块2转10------------------
BINIDEC PROC NEAR
PUSH BX ;保护现场
PUSH CX
PUSH SI
PUSH DI
MOV CX,10
CALL DEC_DIV ;调用DEC_DIV
MOV CX,1
CALL DEC_DIV ;调用DEC_DIV
POP DI ;恢复现场
POP SI
POP CX
POP BX
RET
BINIDEC ENDP
;---------DEC_DIV模块-------------------
DEC_DIV PROC NEAR
MOV AX,BX
MOV DX,0
DIV CX ;求商余
MOV BX,DX
MOV DL,AL
ADD DL,30H
MOV AH,2
INT 21H
RET
DEC_DIV ENDP
;---------NEWLINE换行模块-------------------
NEWLINE PROC NEAR
MOV DX,OFFSET MEG4 ;传入MEG4的有效地址
MOV AH,9
INT 21H
RET
NEWLINE ENDP
;---------结束-------------------
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -