8086汇编实现接收从键盘输入的一个班的学生成绩,并存放于30字的grade数组中,各数据的格式为: 学号,成绩1,成绩2,...,成绩5 然后根据grade中的学生成绩,把学生名次填入rank数据组中,并显示出来, 格式为: 学号,名次
时间: 2024-02-18 07:03:15 浏览: 73
好的,这是一个比较复杂的问题,需要涉及到键盘输入、数组操作、排序等知识点。我会尽力为你解答,但是由于篇幅限制,可能无法一一详细讲解。请耐心看完以下代码,并结合自己的汇编基础加深理解。
首先,我们需要定义三个数组:`grade`、`rank`、`temp`。`grade`数组用于存储学生成绩,`rank`数组用于存储学生成绩排名,`temp`数组用于在排序时暂存数据。
```
grade db 30 dup(0) ; 存储学生成绩
rank db 30 dup(0) ; 存储学生成绩排名
temp db 5 dup(0) ; 暂存数据
```
接下来,我们需要实现从键盘输入学生成绩的功能。这可以使用BIOS中断`INT 21h`中的`AH=01h`实现。具体代码如下:
```
mov cx, 5 ; 循环5次,输入5个学生成绩
mov si, offset grade ; 存储到grade数组中
input_loop:
mov ah, 01h ; 功能号1:从键盘读入一个字符
int 21h ; 调用BIOS中断
mov [si], al ; 存储到grade数组中
inc si ; 指向下一个数据
loop input_loop ; 继续输入下一个数据
```
接下来,我们需要实现对学生成绩的排序,并按照排名存储到`rank`数组中。这里我们使用冒泡排序算法,具体代码如下:
```
mov cx, 5 ; 循环5次,排序5个学生成绩
mov si, offset grade ; 指向grade数组
mov di, offset temp ; 指向temp数组
sort_loop:
mov ah, [si] ; 取出当前数据
mov [di], ah ; 存储到temp数组中
inc si
inc di
loop sort_loop
mov cx, 5 ; 重置循环计数器
mov si, offset temp ; 指向temp数组
mov di, offset rank ; 指向rank数组
mov bl, 1 ; 记录当前排名
sort_loop2:
mov ah, [si] ; 取出当前数据
mov [di], bl ; 存储当前排名
inc si
inc di
loop sort_loop2
dec cx ; 循环计数器减1
jz output ; 如果已经排完序,跳转到输出结果
mov cx, 4 ; 重置循环计数器
mov si, offset temp ; 指向temp数组
sort_loop3:
mov al, [si] ; 取出当前数据
cmp al, [si+1] ; 比较相邻两个数据的大小
jbe no_swap ; 如果前一个小于等于后一个,不交换
mov ah, [si+1] ; 否则交换两个数据
mov [si], ah
mov [si+1], al
no_swap:
inc si ; 指向下一个数据
loop sort_loop3 ; 继续排序下一个数据
inc bl ; 当前排名加1
jmp sort_loop2 ; 继续排序下一个学生成绩
```
最后,我们需要将学号和名次显示出来。这里我们使用BIOS中断`INT 21h`中的`AH=02h`实现。具体代码如下:
```
output:
mov cx, 5 ; 循环5次
mov si, offset grade ; 存储到grade数组中
mov di, offset rank ; 存储到rank数组中
output_loop:
mov ah, 02h ; 功能号2:显示一个字符
mov dl, [si] ; 显示当前数据
int 21h ; 调用BIOS中断
mov ah, 02h ; 功能号2:显示一个字符
mov dl, ',' ; 显示逗号
int 21h ; 调用BIOS中断
mov ah, 02h ; 功能号2:显示一个字符
mov dl, [di] ; 显示当前名次
int 21h ; 调用BIOS中断
mov ah, 02h ; 功能号2:显示一个字符
mov dl, ',' ; 显示逗号
int 21h ; 调用BIOS中断
add si, 6 ; 指向下一个学生成绩
inc di ; 指向下一个名次
loop output_loop ; 继续输出下一个学生的信息
```
这样,我们就完成了整个程序的编写。完整代码如下:
阅读全文