利用dosbox汇编实现以下功能接收从键盘输入的一个班的学生成绩,并存放于30字的grade数组中,各数据的格式为: 学号,成绩1,成绩2,...,成绩5 然后根据grade中的学生成绩,把学生名次填入rank数据组中,并显示出来, 格式为: 学号,名次
时间: 2023-11-24 21:08:07 浏览: 67
编写程序,接收从键盘输入某班学生的成绩,对学生的成绩进行排序,最后把学生成绩、名次显示出来
5星 · 资源好评率100%
下面是一个在DOSBox中运行的汇编程序,可以实现你的要求。程序中使用INT 21h中断来实现键盘输入和屏幕输出。
```assembly
.MODEL SMALL
.STACK 100H
.DATA
grade DB 30 DUP(5) ; 存放学生成绩
rank DB 30 DUP(1) ; 存放学生名次
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
; 从键盘输入学生成绩
MOV CX, 30 ; 循环30次,输入每个学生的成绩
MOV SI, 0
INPUT_GRADE:
MOV AH, 01h ; 读取键盘输入
INT 21h
SUB AL, '0' ; 将ASCII码转换为数字
MOV [grade+SI], AL ; 存储学生成绩
INC SI
CMP SI, 150 ; 150 = 30 * 5,检查是否输入完毕
JNE INPUT_GRADE
; 计算学生名次
MOV CX, 30 ; 循环30次,计算每个学生的名次
MOV SI, 0
CALC_RANK:
MOV BX, SI ; BX 存储当前学生的索引
INC BX ; 检查下一个学生
MOV DI, BX ; DI 存储下一个学生的索引
CMP DI, 30
JGE END_CALC_RANK ; 判断是否计算完毕
COMPARE_GRADE:
MOV AL, [grade+BX*5] ; 获取当前学生的成绩
MOV DL, [grade+DI*5] ; 获取下一个学生的成绩
CMP AL, DL ; 比较两个学生的成绩
JAE SKIP_SWAP ; 如果当前学生的成绩大于等于下一个学生的成绩,跳过交换
MOV CL, [rank+BX] ; 交换当前学生和下一个学生的名次
MOV CH, [rank+BX+1]
MOV [rank+BX], [rank+DI]
MOV [rank+BX+1], [rank+DI+1]
MOV [rank+DI], CL
MOV [rank+DI+1], CH
SKIP_SWAP:
INC BX ; 检查下一个学生
INC DI
CMP DI, 30
JGE END_CALC_RANK
JMP COMPARE_GRADE
END_CALC_RANK:
; 显示每个学生的学号和名次
MOV CX, 30 ; 循环30次,显示每个学生的学号和名次
MOV SI, 0
OUTPUT_RANK:
MOV AH, 02h ; 显示字符
MOV DL, [grade+SI*5] ; 显示学号
ADD DL, '0' ; 将数字转换为ASCII码
INT 21h
MOV DL, ','
INT 21h
MOV DL, [rank+SI*2] ; 显示名次的十位数
ADD DL, '0'
INT 21h
MOV DL, [rank+SI*2+1] ; 显示名次的个位数
ADD DL, '0'
INT 21h
MOV DL, 0dh
INT 21h
MOV DL, 0ah
INT 21h
INC SI
CMP SI, 30
JNE OUTPUT_RANK
MOV AH, 4ch ; 返回操作系统
INT 21h
MAIN ENDP
END MAIN
```
在DOSBox中,可以通过以下步骤来运行汇编程序:
1. 在DOSBox中创建一个目录,例如C:\ASM
2. 将上述汇编代码保存为.asm文件,例如C:\ASM\program.asm
3. 打开DOSBox,进入C:\ASM目录
4. 输入以下命令,生成可执行文件:
```
tasm program.asm
tlink program.obj
```
5. 输入以下命令,运行程序:
```
program.exe
```
注意:以上代码仅供参考,可能需要根据具体汇编环境进行一些修改,例如使用不同的汇编语言规范、修改INT 21h参数等。
阅读全文