8086汇编利用dosbox写出一个程序,满足以下要求1、主要功能 设计一个班级成绩管理系统;统计计算学生的成绩,然后对学生的按统计成绩进行排名,最后输出学生的名次; 基本要求 接收从键盘输入的一个班的学生成绩,并存放于30字的grade数组中,各数据的格式为: 学号,成绩1,成绩2,...,成绩5 然后根据grade中的学生成绩,把学生名次填入rank数据组中,并显示出来, 格式为: 学号,名次
时间: 2024-02-20 15:56:30 浏览: 20
以下是一个简单的8086汇编程序,用于实现班级成绩管理系统:
```
.model small
.stack 100h
.data
grade db 30*6 dup(0) ; 存放学生成绩的数组
rank db 30 dup(0) ; 存放学生名次的数组
n db 30 ; 学生人数
newline db 0dh, 0ah, '$' ; 换行符
.code
start:
mov ax, @data
mov ds, ax
; 接收从键盘输入的学生成绩
mov si, offset grade
mov cx, 30
input_loop:
mov ah, 01h
int 21h ; 读取一个字符
cmp al, '$' ; 判断是否结束输入
je input_done
cmp al, ',' ; 判断是否为逗号
je next_grade
sub al, '0' ; 将字符转换成数字
mov [si], al ; 将数字存入数组
inc si
jmp input_loop
next_grade:
inc cx
jmp input_loop
input_done:
; 计算学生的成绩并排序
mov si, offset grade
mov di, offset rank
mov bx, 1
mov ax, 0
mov dx, 0
calc_loop:
mov cx, 5 ; 一个学生有5门成绩
add ax, [si+1] ; 计算总成绩
add dx, ax
mov bx, ax ; 将总成绩存入bx
mov ax, 0 ; 清零ax
sub cx, 1
jz sort_rank ; 如果计算完了5门成绩,就跳转到排序
add si, 1 ; 移动到下一门成绩
jmp calc_loop
sort_rank:
mov si, offset grade
mov di, offset rank
mov bx, 1
mov cx, 30
sort_loop:
mov al, [si] ; 取出学生的总成绩
mov ah, 0
mov [di], bx ; 将名次存入rank数组
inc bx
add si, 6 ; 移动到下一个学生的成绩
add di, 1 ; 移动到下一个名次
loop sort_loop
; 输出学生的名次
mov si, offset grade
mov di, offset rank
mov cx, 30
output_loop:
mov ah, 09h ; DOS中断21h的打印字符函数
mov dx, offset newline
int 21h
mov ah, 02h ; 打印学号
mov dl, [si]
int 21h
mov ah, 02h ; 打印逗号
mov dl, ','
int 21h
mov ah, 02h ; 打印名次
mov dl, [di]
add dl, '0' ; 将数字转换成字符
int 21h
add si, 6 ; 移动到下一个学生的成绩
add di, 1 ; 移动到下一个名次
loop output_loop
; 程序结束
mov ah, 4ch
int 21h
end start
```
在DOSBox中编译和运行程序的步骤如下:
1. 将上述代码保存为一个文本文件(例如 `score.asm`)。
2. 打开DOSBox,进入代码所在的目录。
3. 输入 `masm score.asm`,编译代码并生成 .obj 文件。
4. 输入 `link score.obj`,将 .obj 文件链接成可执行文件。
5. 输入 `score.exe`,运行程序。程序会提示输入学生成绩,按照题目要求输入即可。程序会输出每个学生的名次。