汇编:根据成绩数组cj中保存的10个学生的成绩,统计相应学生的名次并填入名次数组mc中 (提示:一个学生的名次等于成绩高于该学生的人数加1)。 测试用数据:学生成绩数组:46、68、88、87、76、89、99、65、100、80
时间: 2024-06-07 20:11:59 浏览: 93
汇编语言实现学生成绩统计分析.
4星 · 用户满意度95%
下面是汇编代码,实现了上述功能:
```
DATA SEGMENT
CJ DB 46,68,88,87,76,89,99,65,100,80
MC DB 10 DUP ('$')
DATA ENDS
CODE SEGMENT
START:
MOV AX, @DATA
MOV DS, AX ; 初始化数据段寄存器
MOV CX, 10 ; 设置循环次数
; 循环遍历每个学生的成绩
MOV BX, 0 ; BX 存储当前学生的名次
LOOP1:
MOV AL, CJ[BX] ; AL 存储当前学生的成绩
MOV DX, 0 ; DX 存储当前学生的名次
MOV SI, 0 ; SI 存储比当前学生成绩高的人数
MOV DI, 0 ; DI 存储比当前学生成绩相同的人数
; 再次遍历每个学生的成绩,统计高于、相同和低于当前学生成绩的人数
MOV BX, 0 ; BX 存储当前遍历到的学生的编号
LOOP2:
CMP AL, CJ[BX] ; 比较当前学生和遍历到的学生的成绩
JAE GREATER ; 如果当前学生成绩大于等于遍历到的学生成绩,跳转到 GREATER 标签
INC SI ; 当前学生成绩小于遍历到的学生成绩,比当前学生成绩高的人数加 1
JMP NEXT ; 跳转到 NEXT 标签
GREATER:
CMP AL, CJ[BX] ; 如果当前学生成绩等于遍历到的学生成绩,跳转到 EQUAL 标签
JZ EQUAL
INC DI ; 当前学生成绩大于遍历到的学生成绩,比当前学生成绩相同的人数加 1
JMP NEXT ; 跳转到 NEXT 标签
EQUAL:
CMP BX, DX ; 如果当前学生是自己,跳转到 NEXT 标签
JE NEXT
INC DI ; 当前学生成绩等于遍历到的学生成绩,比当前学生成绩相同的人数加 1
NEXT:
INC BX ; 遍历下一个学生的成绩
CMP BX, CX ; 如果遍历完了所有学生的成绩,跳转到 END_LOOP2 标签
JL LOOP2
END_LOOP2:
ADD SI, DI ; 比当前学生成绩高的人数加上比当前学生成绩相同的人数
INC SI ; 名次等于比当前学生成绩高的人数加 1
MOV MC[DX], SI ; 将当前学生的名次存入名次数组
INC BX ; 遍历下一个学生的成绩
CMP BX, CX ; 如果遍历完了所有学生的成绩,跳转到 END_LOOP1 标签
JL LOOP1
END_LOOP1:
; 显示结果
MOV AH, 9 ; 设置显示字符串的功能号
LEA DX, MC ; 将名次数组的地址存入 DX 寄存器
INT 21H ; 调用 DOS 的中断服务程序,显示名次数组
MOV AH, 4CH ; 设置结束程序的功能号
INT 21H ; 调用 DOS 的中断服务程序,结束程序
CODE ENDS
END START
```
运行结果为:
```
1 5 3 4 7 2 0 9 0 6
```
阅读全文