用80386汇编语言根据成绩数组cj中保存的10个学生的成绩,统计相应学生的名次并填入名次数组mc中 (提示:一个学生的名次等于成绩高于该学生的人数加1)。 测试用数据:学生成绩数组:46、68、88、87、76、89、99、65、100、80
时间: 2024-06-08 12:06:23 浏览: 88
下面是用80386汇编语言实现的代码:
```
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 si, offset cj ; 将si指向成绩数组
mov di, offset mc ; 将di指向名次数组
mov cx, 10 ; 循环10次,对每个学生进行统计
mov bx, cx ; bx用于保存比当前学生成绩高的人数
loop1:
mov al, [si] ; 取出当前学生的成绩
mov si, si + 1 ; 指向下一个学生的成绩
xor bh, bh ; bh清零
mov dx, di ; 将dx指向名次数组
mov ax, cx ; ax用于保存当前学生的名次
loop2:
cmp al, [dx] ; 比较当前学生成绩和名次数组中的成绩
jge next ; 如果当前学生成绩小于等于名次数组中的成绩,跳过
inc bh ; 比当前学生成绩高的人数加1
next:
cmp dx, di ; 如果已经比较完整个名次数组,跳出循环
je endloop2
inc dx ; 指向下一个成绩
jmp loop2
endloop2:
add bx, 1 ; 比当前学生成绩高的人数加1
sub ax, bx ; 计算当前学生的名次
mov [di], al ; 将当前学生的名次保存到名次数组中
inc di ; 指向下一个名次
loop loop1
; 输出名次数组
mov si, offset mc ; 将si指向名次数组
mov cx, 10 ; 循环10次,输出每个学生的名次
mov ah, 02h ; 设置输出函数号
loop3:
mov dl, [si] ; 取出当前学生的名次
add dl, 30h ; 转换为ASCII码
mov ah, 02h ; 设置输出函数号
int 21h ; 调用中断21h,输出当前学生的名次
mov dl, ',' ; 输出逗号分隔符
mov ah, 02h ; 设置输出函数号
int 21h ; 调用中断21h,输出逗号
inc si ; 指向下一个名次
loop loop3
; 程序结束
mov ah, 4ch ; 设置退出函数号
int 21h ; 调用中断21h,结束程序
code ends
end start
```
上面的代码使用了两层循环:外层循环对每个学生进行统计,内层循环比较当前学生成绩和名次数组中的成绩,计算比当前学生成绩高的人数,最后计算当前学生的名次并保存到名次数组中。最后,程序输出名次数组中每个学生的名次。
阅读全文