⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4.asm

📁 简易学生成绩排序(汇编) 编制一程序
💻 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 + -