汇编利用dosbox0.74写一个程序实现以下基本要求 接收从键盘输入的一个班的学生成绩,并存放于30字的grade数组中,各数据的格式为: 学号,成绩1,成绩2,...,成绩5 然后根据grade中的学生成绩,把学生名次填入rank数据组中,并显示出来, 格式为: 学号,名次
时间: 2024-02-19 12:03:58 浏览: 149
好的,我会尽力回答你的问题。首先需要了解一些汇编语言的知识。在 DOSBox 中,我们可以使用 Int 21h 中断来实现键盘输入和屏幕输出的功能。以下是具体实现步骤:
1. 定义数据段和堆栈段
```
.model small
.stack 100h
.data
grade db 30 dup(0) ; 成绩数组,每个学生5门课程,共6个字节
rank db 30 dup(0) ; 名次数组,每个学生1个字节
newline db 0dh, 0ah, '$' ; 换行符
.code
```
2. 实现键盘输入功能
```
input:
mov ah, 0ah ; 设置 ah 寄存器为 0ah,表示从键盘输入一个字符
mov dx, offset grade ; 将 grade 数组的偏移地址传递给 dx 寄存器
int 21h ; 调用 21h 中断
ret
```
3. 实现成绩排序和名次计算功能
```
sort:
mov si, offset grade ; 将 grade 数组的偏移地址传递给 si 寄存器
mov cx, 30 ; 学生数为 30
mov bx, cx ; 学生数的备份
mov di, offset rank ; 将 rank 数组的偏移地址传递给 di 寄存器
mov al, 1 ; 初始名次为 1
mov ah, 0 ; 初始最高分数为 0
sort_loop:
cmp cx, 0 ; 比较 cx 和 0
je sort_end ; 如果 cx 等于 0,跳转到 sort_end 标签处
mov dl, [si+1] ; 将学生的第一门成绩传递给 dl 寄存器
add dl, [si+2] ; 将学生的第二门成绩加到 dl 寄存器中
add dl, [si+3] ; 将学生的第三门成绩加到 dl 寄存器中
add dl, [si+4] ; 将学生的第四门成绩加到 dl 寄存器中
add dl, [si+5] ; 将学生的第五门成绩加到 dl 寄存器中
cmp dl, ah ; 比较 dl 寄存器和 ah 寄存器
jle rank_cal ; 如果 dl <= ah,跳转到 rank_cal 标签处
mov ah, dl ; 将最高分数更新为 dl
mov al, 1 ; 名次更新为 1
rank_cal:
mov [di], al ; 将学生名次传递给 rank 数组
inc si ; si 寄存器加 6,指向下一个学生
inc di ; di 寄存器加 1,指向下一个名次
inc al ; 名次加 1
loop sort_loop ; 循环排序
sort_end:
ret
```
4. 实现屏幕输出功能
```
output:
mov ah, 9 ; 设置 ah 寄存器为 9,表示向屏幕输出一个字符串
mov dx, offset newline ; 将换行符的偏移地址传递给 dx 寄存器
int 21h ; 调用 21h 中断
mov si, offset grade ; 将 grade 数组的偏移地址传递给 si 寄存器
mov cx, bx ; 将学生数的备份传递给 cx 寄存器
mov di, offset rank ; 将 rank 数组的偏移地址传递给 di 寄存器
output_loop:
cmp cx, 0 ; 比较 cx 和 0
je output_end ; 如果 cx 等于 0,跳转到 output_end 标签处
mov ah, 2 ; 设置 ah 寄存器为 2,表示向屏幕输出一个字符
mov dl, [si] ; 将学生的学号传递给 dl 寄存器
int 21h ; 调用 21h 中断
mov ah, 2 ; 设置 ah 寄存器为 2,表示向屏幕输出一个字符
mov dl, ',' ; 将逗号传递给 dl 寄存器
int 21h ; 调用 21h 中断
mov ah, 2 ; 设置 ah 寄存器为 2,表示向屏幕输出一个字符
mov dl, [di] ; 将学生的名次传递给 dl 寄存器
int 21h ; 调用 21h 中断
mov ah, 9 ; 设置 ah 寄存器为 9,表示向屏幕输出一个字符串
mov dx, offset newline ; 将换行符的偏移地址传递给 dx 寄存器
int 21h ; 调用 21h 中断
add si, 6 ; si 寄存器加 6,指向下一个学生
inc di ; di 寄存器加 1,指向下一个名次
loop output_loop ; 循环输出
output_end:
ret
```
5. 主程序
```
main:
call input ; 调用 input 子程序,从键盘输入学生成绩
call sort ; 调用 sort 子程序,排序并计算名次
call output ; 调用 output 子程序,向屏幕输出学生名次
mov ah, 4ch ; 设置 ah 寄存器为 4ch,表示程序结束
int 21h ; 调用 21h 中断
end main
```
以上就是汇编程序的基本实现。注意,在 DOSBox 中编写汇编程序需要使用文本编辑器,将代码保存为 .asm 格式,然后使用 TASM 和 TLINK 工具编译链接生成 .exe 可执行文件。
阅读全文