一.要求:
建立一个可存放5个人成绩的成绩表,每行包括两个部分:人名(2个字符)和成绩,并将其排序后输出,并在屏幕显示。
二.实现:
可以用一个变量存储成绩表,姓名(两位字符)+成绩(数字);
这里使用的是冒泡排序,使用XCHG命令交换姓名与成绩;
代码:
DATA SEGMENT
LIST DB 'AB',72,'CD',93,'EF',85,'GH',84,'IJ',86
DIVNUM DB 10 ;存储除数10
TEMP DB ? ;DIV时暂存余数
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET LIST ;取出LIST偏移
MOV CX,4 ;内循环次数
MOV SI,5 ;外循环次数
MOV DI,2 ;游标(初始化为2,即取第一个学生成绩)
LOP1:
MOV AL,[BX+DI] ;第i个学生成绩
MOV DX,[BX+DI-2] ;第i个学生姓名
CMP AL,[BX+DI+3] ;与第i+1个学生成绩比较
JA SKIP ;大于则不交换
XCHG AL,[BX+DI+3] ;交换成绩
XCHG DX,[BX+DI+1] ;交换姓名
MOV [BX+DI],AL ;存回
MOV [BX+DI-2],DX
SKIP:
ADD DI,3 ;游标指向下一个学生成绩
LOOP LOP1
MOV DI,2 ;内层循环结束,游标归位
DEC SI ;外层循环
MOV CX,4 ;重置内层循环
CMP SI,0 ;判断外层循环结束
JNZ LOP1
DISP:
MOV CX,5
MOV DI,2
LOP2:
MOV AH,02H ;输出姓名
MOV DL,[BX+DI-2]
INT 21H
MOV DL,[BX+DI-1]
INT 21H
MOV DL,[BX+DI] ;输出成绩
MOV AL,DL ;不能mov ax,dl,需分开赋值
MOV AH,00
DIV DIVNUM ;余数放于AH
ADC AL,30H ;需要加H,不然默认为十进制数,也可以加48
ADC AH,30H
MOV TEMP,AH ;暂存余数
MOV DL,AL ;商(十位)
MOV AH,02H
INT 21H
MOV DL,TEMP ;余数(个位)
MOV AH,02H
INT 21H
MOV DL,32 ;输出空格
INT 21H
ADD DI,3
LOOP LOP2
EXIT:
MOV AH,4CH
INT 21H
CODE ENDS
END START
程序有两个注意的地方:
1.交换成绩与姓名使用的XCHG命令,避免从内存到寄存器再到内存的往复操作;
2.结果显示到屏幕上应该将两位数分开,在找到对应ASCII码值,输出对应数字。
三.结果:
姓名、成绩可以自行更改;
可以自行优化代码,或考虑用选择排序实现。
最后,“书山有路勤为径,学海无涯苦作舟。”