接收从键盘输入的一个班的学生成绩,并存放于30字的grade数组中,各数据的格式为: 学号,成绩1,成绩2,...,成绩5 然后根据grade中的学生成绩,把学生名次填入rank数据组中,并显示出来, 格式为: 学号,名次
时间: 2023-11-13 18:05:05 浏览: 54
好的,下面是使用8086汇编语言编写的程序,用于接收从键盘输入的一个班的学生成绩,存放于30字的grade数组中,然后根据grade中的学生成绩,把学生名次填入rank数据组中,并显示出来,格式为: 学号,名次。
```
data segment
grade db 30 dup (?) ; 学生成绩数组
rank db 30 dup (?) ; 学生名次数组
data ends
code segment
start:
mov ax, data
mov ds, ax ; 初始化数据段寄存器
mov cx, 6 ; 循环6次,输入6个学生的成绩
input:
mov ah, 01h ; 从键盘输入一个字符
int 21h ; 调用DOS中断
cmp al, 0dh ; 比较输入的字符是否为回车
je next ; 如果是回车,跳转到下一次循环
mov [grade], al ; 将输入的字符存入数组
inc grade ; 数组指针加一
jmp input ; 继续等待输入
next:
dec cx ; 循环计数器减一
jnz input ; 如果循环计数器不为零,继续循环
; 计算学生名次
mov si, 0 ; 初始化si为0
loop1:
mov di, si ; 初始化di为si
inc di ; di指向下一个元素
loop2:
cmp di, 6 ; 比较di是否越界
jae next1 ; 如果越界,结束循环
mov al, [grade+di*6] ; 取出当前学生的成绩
mov bl, [grade+si*6] ; 取出最高分的成绩
cmp al, bl ; 比较当前学生的成绩和最高分的成绩
jbe next2 ; 如果当前学生的成绩小于等于最高分的成绩,跳转到下一次循环
inc rank+si ; 学生名次加一
dec rank+di ; 当前学生名次减一
next2:
inc di ; di指向下一个元素
jmp loop2 ; 继续循环
next1:
inc si ; si指向下一个元素
cmp si, 6 ; 比较si是否越界
jb loop1 ; 如果没有越界,继续循环
; 输出学生名次
mov ah, 02h ; 输出函数号
mov dl, '1' ; 初始化学生编号为1
mov si, 0 ; 初始化si为0
loop3:
mov ah, 02h ; 输出函数号
mov dl, si+1 ; 输出学生编号
int 21h ; 调用DOS中断
mov ah, 02h ; 输出函数号
mov dl, ',' ; 输出逗号
int 21h ; 调用DOS中断
mov al, [rank+si] ; 取出学生名次
add al, 30h ; 将数字转换为字符
mov ah, 02h ; 输出函数号
mov dl, al ; 输出学生名次
int 21h ; 调用DOS中断
mov ah, 02h ; 输出函数号
mov dl, 0dh ; 输出回车
int 21h ; 调用DOS中断
mov ah, 02h ; 输出函数号
mov dl, 0ah
int 21h ; 调用DOS中断
inc si ; si指向下一个元素
cmp si, 6 ; 比较si是否越界
jb loop3 ; 如果没有越界,继续循环
mov ah, 4ch ; 退出函数号
int 21h ; 调用DOS中断
code ends
end start
```
该程序首先定义了一个数据段,其中包含了存储学生成绩和学生名次的数组。然后定义了一个代码段,其中包含了程序的主函数。
程序的主函数首先使用循环从键盘输入6个学生的成绩,并存入grade数组中。然后使用双重循环计算每个学生的名次,并将结果存入rank数组中。最后输出学生的名次。
这个程序可以通过汇编器进行编译,生成可执行文件后可以在DOS环境下运行。