问题
将0~100之间的10个成绩存入首址为1000H的单元中。1000H+i表示学号为i的学生成绩,编写程序能在2000H开始的区域排出名次表。2000H+i为学号i的学生的名次
源代码
include io.inc
.model small
.stack
.data
stunum equ 10
msg db 'input 10 students score: ',13,10,'$'
omsg db ' ranking: $'
org 1000h
score db 10 dup(?)
; 存放输入的成绩数据
fuben db 10 dup(?)
; 成绩副本,待排序利用
index db 10 dup(?)
; 编号,成绩的输入顺序,跟着副本排序一起交换,相当于结构体
org 2000h
sequ db 10 dup(?)
; 存放相对应成绩的排序
.code
.startup
;readsib 输入有符号十进制整数(-128~127)出口:AL=8位数据
mov dx,offset msg
mov ah,09h
int 21h
; 输出输入提示
mov cx,stunum
; 循环次数
mov si,offset score
mov di,offset fuben
input: call readsib
; 输入无符号数据并存放到al里
call dispcrlf
; 回车换行
mov byte ptr[si],al
mov byte ptr[di],al
inc si
inc di
loop input
mov al,0
mov cx,stunum
mov si,offset index
init: mov [si],al
inc si
inc al
loop init
; 初始化index
mov cx,stunum ;冒泡排序外层循环次数
dec cx
outlp: mov dx,cx ; dx 冒泡排序内层循环次数
mov si,offset fuben
mov di,offset index
inlp:mov al,[si]
mov ah,[di]
cmp al,[si+1] ; 与下一个元素进行比较
jnb next ;不小于则跳转,小于交换,从大到小进行排序
xchg al,[si+1]
xchg ah,[di+1]
mov [si],al
mov [di],ah
; 交换fuben,index的数据
next:inc si
inc di
dec dx
jnz inlp
loop outlp
; 冒泡排序
mov cx,stunum
mov dl,1
mov si,offset index
mov bh,0
order: mov bl,[si]
mov sequ[bx],dl ; 得到排名为dl,相对与输入数据的位置,并赋值
inc dl
inc si
loop order ;计算输入数据相应的排名
mov cx,stunum
mov bx,0
output: mov al,score[bx]
call dispuib
mov dx,offset omsg
mov ah,09h
int 21h
mov al,sequ[bx]
call dispuib
call dispcrlf
inc bx
loop output ;输出
.exit
end