汇编利用dosbox 0.74-3写出一个程序,实现以下功能:1、主要功能 设计一个班级成绩管理系统;统计计算学生的成绩,然后对学生的按统计成绩进行排名,最后输出学生的名次; 基本要求 接收从键盘输入的一个班的学生成绩,并存放于30字的grade数组中,各数据的格式为: 学号,成绩1,成绩2,...,成绩5 然后根据grade中的学生成绩,把学生名次填入rank数据组中,并显示出来, 格式为: 学号,名次
时间: 2024-02-24 16:54:46 浏览: 168
下面是一个简单的汇编程序,用于实现您的班级成绩管理系统。程序利用DOSBox 0.74-3运行,接收从键盘输入的学生成绩,然后按照成绩进行排名,并输出学生的名次。请注意,此程序是一个简单的示例,您可能需要根据自己的需求进行修改。
```
.model small
.stack 100h
.data
grade db 30 dup(0) ; 存储学生成绩
rank db 30 dup(0) ; 存储学生名次
count dw 0 ; 学生数量
newline db 0dh, 0ah, '$'
.code
start:
mov ax, @data ; 初始化数据段寄存器
mov ds, ax
; 从键盘输入学生成绩
mov ah, 0ah ; 功能号为0ah,从键盘缓冲区输入字符串
mov dx, offset grade ; 输入的字符串存储在grade数组中
int 21h ; 调用DOS中断
; 统计学生数量
mov si, offset grade ; si指向grade数组
mov cx, 30 ; 循环30次
xor ax, ax ; 清零ax寄存器,用于计数
loop1:
cmp byte ptr [si], 0 ; 如果学号为0,则退出循环
je exit_loop1
inc ax ; 计数器加1
add si, 7 ; 每个学生占据7个字节,跳过成绩
loop loop1
exit_loop1:
mov count, ax ; 存储学生数量
; 计算学生名次
mov si, offset grade ; si指向grade数组
mov di, offset rank ; di指向rank数组
mov bx, count ; 循环count次
loop2:
xor ax, ax ; 清零ax寄存器,用于比较成绩
mov al, [si+1] ; 取出第一个成绩
cmp al, [si+2] ; 比较第一个成绩和第二个成绩
jl swap ; 如果第一个成绩小于第二个成绩,则交换两个成绩
mov al, [si+1] ; 取出第一个成绩
cmp al, [si+3] ; 比较第一个成绩和第三个成绩
jl swap ; 如果第一个成绩小于第三个成绩,则交换两个成绩
mov al, [si+1] ; 取出第一个成绩
cmp al, [si+4] ; 比较第一个成绩和第四个成绩
jl swap ; 如果第一个成绩小于第四个成绩,则交换两个成绩
mov al, [si+1] ; 取出第一个成绩
cmp al, [si+5] ; 比较第一个成绩和第五个成绩
jl swap ; 如果第一个成绩小于第五个成绩,则交换两个成绩
jmp no_swap ; 否则不用交换
swap:
xchg [si+1], [si+2] ; 交换第一个成绩和第二个成绩
xchg [di], [di+1] ; 交换名次
no_swap:
inc di ; 增加名次
add si, 7 ; 每个学生占据7个字节,跳过成绩
dec bx ; 循环计数器减1
jnz loop2 ; 如果循环计数器不为0,则继续循环
; 输出学生名次
mov ah, 9 ; 功能号为9,输出字符串
mov si, offset grade ; si指向grade数组
mov di, offset rank ; di指向rank数组
mov cx, count ; 循环count次
loop3:
mov dx, si ; 输出学号
int 21h
mov dx, offset newline ; 输出换行符
int 21h
mov dx, di ; 输出名次
int 21h
mov dx, offset newline ; 输出换行符
int 21h
add si, 7 ; 每个学生占据7个字节,跳过成绩
inc di ; 增加名次
loop loop3
; 程序结束
mov ah, 4ch ; 功能号为4ch,程序结束
int 21h
end start
```
阅读全文