输入5个同学成绩(有学号提示),然后排序,最后显示出名次表(学号,成绩)要求:应用子程序设计,程序中要有成绩录入模块、排序模块、输出模块
时间: 2024-02-21 18:00:58 浏览: 136
好的,下面是一个简单的x86汇编语言程序,实现了你的要求。请注意,由于汇编语言的语法较为严格,需要按照一定的格式进行编写。此外,由于输入输出和排序均需要使用系统调用,因此需要在程序开头处定义一些常量。
```
section .data
message db '请输入5个同学的学号和成绩(每行2个数字,用空格分隔):', 0
length equ $ - message
output db '名次表:', 0
out_length equ $ - output
format db '%d', 0
format_length equ $ - format
scores dw 0,0,0,0,0
section .bss
input resb 3
section .text
global _start
_start:
; 输出提示信息
mov eax, 4
mov ebx, 1
mov ecx, message
mov edx, length
int 0x80
; 录入成绩
mov ecx, 5
mov esi, 0
input_loop:
; 读入学号
mov eax, 3
mov ebx, 0
mov ecx, input
mov edx, 2
int 0x80
; 将学号转换为数值
mov bl, [input]
sub bl, '0'
mov bh, [input+1]
sub bh, '0'
shl bh, 4
add bl, bh
; 读入成绩
mov eax, 3
mov ebx, 0
mov ecx, input+2
mov edx, 1
int 0x80
; 将成绩转换为数值
mov al, [input+2]
sub al, '0'
; 将学号和成绩存入数组
mov [scores+esi], ax
; 计算下一个数组元素的偏移量
add esi, 2
; 如果还有未录入的成绩,继续循环
loop input_loop
; 对成绩进行排序
mov ecx, 5
sort_loop:
mov esi, 0
inner_loop:
mov eax, [scores+esi]
cmp eax, [scores+esi+2]
jg swap
add esi, 2
loop inner_loop
jmp next
swap:
xchg eax, [scores+esi+2]
mov [scores+esi], eax
add esi, 2
loop inner_loop
next:
loop sort_loop
; 输出名次表
mov eax, 4
mov ebx, 1
mov ecx, output
mov edx, out_length
int 0x80
mov ecx, 5
mov esi, 0
output_loop:
; 输出学号
mov eax, 4
mov ebx, 1
mov ecx, [scores+esi]
mov edx, format_length
mov esi, format
int 0x80
; 输出空格
mov eax, 4
mov ebx, 1
mov ecx, ' '
mov edx, 1
int 0x80
; 输出成绩
mov eax, 4
mov ebx, 1
mov ecx, [scores+esi+2]
mov edx, format_length
mov esi, format
int 0x80
; 输出换行
mov eax, 4
mov ebx, 1
mov ecx, 10
mov edx, 1
int 0x80
; 计算下一个数组元素的偏移量
add esi, 2
; 如果还有未输出的成绩,继续循环
loop output_loop
; 退出程序
mov eax, 1
xor ebx, ebx
int 0x80
```
这个程序首先输出提示信息,然后使用循环录入5个成绩和学号。录入完成后,使用冒泡排序对成绩进行排序。最后输出名次表,包括学号和成绩。程序中使用了系统调用来读取输入、输出信息和进行排序,这些系统调用均使用int 0x80来实现。
阅读全文