汇编:根据成绩数组cj中保存的10个学生的成绩,统计相应学生的名次并填入名次数组mc中 (提示:一个学生的名次等于成绩高于该学生的人数加1)。 测试用数据:学生成绩数组:46、68、88、87、76、89、99、65、100、80
时间: 2024-02-02 17:03:37 浏览: 13
以下是汇编程序实现:
```assembly
.MODEL SMALL
.STACK 100H
.DATA
cj DB 46,68,88,87,76,89,99,65,100,80 ; 学生成绩数组
mc DB 10 DUP(0) ; 名次数组,初始全部为0
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
MOV CX, 10 ; 循环10次,处理10个学生
MOV BX, 0 ; 初始化计数器,表示比当前学生成绩高的人数
MOV DI, 0 ; 初始化指针,指向名次数组mc的第一个元素
LOOP_START:
MOV AL, cj[DI] ; 取出当前学生成绩
INC DI ; 指针加1,指向下一个学生的成绩
; 统计比当前学生成绩高的人数
MOV SI, 0 ; 初始化指针,指向学生成绩数组cj的第一个元素
MOV DX, 0 ; 初始化计数器,表示比当前学生成绩高的人数
LOOP_COMPARE:
CMP AL, cj[SI] ; 比较当前学生成绩和当前比较的学生成绩
JLE SKIP ; 如果当前学生成绩小于等于当前比较的学生成绩,则跳过加1计数器的操作
INC DX ; 计数器加1,表示比当前学生成绩高的人数加1
SKIP:
INC SI ; 指针加1,指向下一个学生的成绩
LOOP LOOP_COMPARE
; 计算当前学生的名次,即比当前学生成绩高的人数加1
INC DX ; 比当前学生成绩高的人数加1
MOV mc[DI-1], DL ; 将名次保存到名次数组mc中
LOOP LOOP_START
; 输出名次数组mc中的内容
MOV AH, 9 ; DOS中断号,打印字符串
MOV CX, 10 ; 循环10次,输出10个名次
LEA DI, mc ; DI指向名次数组mc的第一个元素
LOOP OUTPUT:
MOV DL, [DI] ; 取出当前名次
ADD DL, 30H ; 转换为ASCII码
MOV AH, 2 ; DOS中断号,打印字符
INT 21H ; 输出当前名次
MOV AH, 2 ; DOS中断号,打印字符
MOV DL, ',' ; 输出逗号分隔符
INT 21H ; 输出逗号
INC DI ; 指针加1,指向下一个名次
LOOP OUTPUT
MOV AH, 4CH ; DOS中断号,程序结束
INT 21H
MAIN ENDP
END MAIN
```
程序运行结果如下:
```
1,3,2,4,6,1,1,9,1,5,
```