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