汇编利用8086dosbox写出程序满足以下条件:接收从键盘输入的一个班的学生成绩,并存放于30字的grade数组中,各数据的格式为: 学号,成绩1,成绩2,...,成绩5 然后根据grade中的学生成绩,把学生名次填入rank数据组中,并显示出来, 格式为: 学号,名次
时间: 2024-02-03 09:02:49 浏览: 87
好的,以下是满足要求的汇编代码:
```
.model small
.stack 100h
.data
grade db 30 dup(?)
rank db 30 dup(?)
newline db 0ah, 0dh, '$'
prompt db '请输入学生成绩(学号,成绩1-5):$'
message db '学号,名次', 0ah, 0dh, '$'
num_students dw 0
max_grade db 0
.code
mov ax, @data
mov ds, ax
; 接收学生成绩
mov cx, 30 ; 最多接受30个学生成绩
mov si, offset grade ; 存放学生成绩的数组的偏移地址
input_loop:
mov ah, 9 ; 显示提示信息
mov dx, offset prompt
int 21h
; 读取用户输入
mov ah, 0ah
mov dx, si
int 21h
; 计算最高成绩和学生数量
mov al, [si+1] ; 第1个字节是成绩1,因此要偏移1
cmp al, max_grade
jle not_new_max
; 更新最高成绩和学生数量
mov max_grade, al
mov num_students, 1
jmp end_input_loop
not_new_max:
; 如果成绩不是最高的,检查是否与最高成绩相同
cmp al, max_grade
jne end_input_loop
; 如果成绩与最高成绩相同,增加学生数量
inc num_students
end_input_loop:
; 判断是否继续接收输入
loop input_loop
; 计算学生名次
mov cx, 30 ; 最多计算30个学生的名次
mov si, offset grade ; 存放学生成绩的数组的偏移地址
rank_loop:
cmp cx, 0 ; 是否遍历完了所有学生
je end_rank_loop
; 如果这个学生的成绩是最高的,名次就是1
mov al, [si+1] ; 第1个字节是成绩1,因此要偏移1
cmp al, max_grade
je set_rank_one
; 如果这个学生的成绩不是最高的,检查是否与最高成绩相同
cmp al, max_grade
jne increment_rank
; 如果这个学生的成绩与最高成绩相同,名次与最高成绩的学生名次相同
mov dl, [rank] ; 复制最高成绩的学生名次
mov [rank+si-offset grade], dl ; 存储学生名次
; 继续遍历下一个学生
jmp next_student
set_rank_one:
; 如果这个学生的成绩是最高的,名次就是1
mov dl, 1
mov [rank+si-offset grade], dl ; 存储学生名次
; 继续遍历下一个学生
jmp next_student
increment_rank:
; 如果这个学生的成绩不是最高的,增加名次
mov dl, [rank] ; 复制上一个学生的名次
inc dl ; 增加名次
mov [rank+si-offset grade], dl ; 存储学生名次
; 继续遍历下一个学生
jmp next_student
next_student:
add si, 6 ; 下一个学生的数据在数组中偏移6个字节
loop rank_loop
end_rank_loop:
; 显示学号和名次
mov ah, 9
mov dx, offset message
int 21h
mov cx, 30 ; 最多显示30个学生
mov si, offset grade ; 存放学生成绩的数组的偏移地址
display_loop:
cmp cx, 0 ; 是否遍历完了所有学生
je end_display_loop
; 显示学号和名次
mov ah, 2 ; 显示字符
mov dl, [si] ; 第0个字节是学号
int 21h
mov ah, 2 ; 显示字符
mov dl, ','
int 21h
mov ah, 2 ; 显示字符
mov dl, [rank+si-offset grade] ; 第i个学生的名次
add dl, 30h ; 转换成ASCII码
int 21h
mov ah, 2 ; 显示字符
mov dl, newline
int 21h
; 继续遍历下一个学生
add si, 6 ; 下一个学生的数据在数组中偏移6个字节
loop display_loop
end_display_loop:
mov ah, 4ch ; 退出程序
int 21h
end
```
请注意,此程序假定用户输入的数据格式正确,并且没有进行任何错误检查。如果需要进行错误检查,请在相应的位置添加适当的代码。
阅读全文