根据成绩数组cj中保存的10个学生的成绩,统计相应学生的名次并填入名次数组mc中。学生成绩数组:46、68、88、87、76、89、99、65、100、80。并给出完整的汇编程序和相应注释
时间: 2023-12-09 14:06:32 浏览: 70
汇编学生成绩排名,能将各个学生的学号,成绩,名次输出
5星 · 资源好评率100%
以下是根据题目要求编写的汇编程序及注释,其中假设成绩数组cj和名次数组mc均存放在内存地址DS:1000H和DS:1010H处,程序使用8086汇编语言编写:
```
ASSUME CS:CODE, DS:DATA
DATA SEGMENT
CJ DB 46, 68, 88, 87, 76, 89, 99, 65, 100, 80 ; 学生成绩数组
MC DB 10 DUP(0) ; 名次数组,初始值均为0
DATA ENDS
CODE SEGMENT
START:
MOV AX, DATA ; 初始化数据段寄存器
MOV DS, AX
MOV CX, 10 ; 循环10次,处理每个学生的成绩
MOV BX, 1000H ; 初始成绩数组地址
MOV SI, 1010H ; 初始名次数组地址
CALC_RANK:
MOV AL, [BX] ; 取出当前学生的成绩
MOV DL, 1 ; 初始名次为1
MOV DH, 0 ; 初始同分数人数为0
ADD BX, 1 ; 成绩数组地址加1,指向下一个学生的成绩
CALC_RANK_LOOP:
CMP BX, 100AH ; 如果已经处理完最后一个成绩,则跳出循环
JZ CALC_RANK_END
CMP AL, [BX] ; 比较当前学生的成绩和下一个学生的成绩
JNE CALC_RANK_NEXT
INC DH ; 如果相等,则同分数人数加1
JMP CALC_RANK_NEXT
CALC_RANK_END:
MOV [SI], DL ; 将当前学生的名次存入名次数组
INC SI ; 名次数组地址加1,指向下一个学生的名次
LOOP CALC_RANK ; 处理下一个学生的成绩
CALC_RANK_NEXT:
INC DL ; 如果下一个学生的成绩比当前学生低,则名次加1
ADD BX, 1 ; 成绩数组地址加1,指向下一个学生的成绩
JMP CALC_RANK_LOOP
MOV AH, 4CH ; 程序结束
INT 21H
CODE ENDS
END START
```
程序的思路是使用两个循环,外层循环处理每个学生的成绩,内层循环计算当前学生的名次。在内层循环中,使用DL寄存器保存当前学生的名次,使用DH寄存器保存同分数人数。每次比较当前学生的成绩和下一个学生的成绩,如果相等,则同分数人数加1;如果下一个学生的成绩比当前学生低,则名次加1,并将当前学生的名次存入名次数组。最后,将名次数组中的结果输出即可。
阅读全文