汇编 学生成绩管理系统 学生成绩排序
怎么把学生姓名和成绩一起按成绩大小排序输出 代码如下
data segment
chengji_tab db 5 dup (20 dup(0))
name_tab db 12,?,13 dup (0)
grade_tab db 4,?,5 dup(0)
chengji db 20 dup(0),13,10,'$'
namecount dw 0
string1 db 'Do you want to insert a item to gradetab?(Y/N)',13,10,'$'
string2 db 'Input name:','$'
string3 db 'Input a grade:','$'
string4 db 'Error!Please enter the requested...',13,10,'$'
string5 db 'name grade.',13,10,'$'
gradeall dw 5 dup ('?')
data ends
stack segment para stack 'stack' ;定义堆栈段
dw 256 dup(0)
stack ends
code segment
assume cs:code,ds:data,es:data,ss:stack
start:
mov ax,data
mov ds,ax
mov es,ax
xor bx,bx
;lea di,chengji_tab
a1: lea dx, string1
mov ah, 9
int 21h
mov ah, 01
int 21h
mov bl,al
call crlf
cmp bl,'n' ;判断输入
jz a2
cmp bl,'N'
jz a2
cmp bl,'y'
jz next1
cmp bl,'Y'
jz next1
lea dx,string4
mov ah,09
int 21h
jmp a1
next1:
lea dx,string2
mov ah,09
int 21h
call intputname
lea dx,string3
mov ah,09
int 21h
call intputgrade
call change
mov si,namecount
shl si,1
mov gradeall[si],bx
INC namecount
cmp namecount,5
jae a2
jmp a1
a2: xor bx,bx
mov bx,namecount
cmp bx,0
jz a3
call printall
call crlf
jmp a4
a3: lea dx,string4
mov ah,09
int 21h
jmp a1 ; 70
a4:
mov ah,4ch ;exit to dos
int 21h
;--------------------
intputname proc near
lea dx,name_tab
mov ah,0ah
int 21h
call crlf
lea si,name_tab + 2
mov ax,namecount
mov di,20
mul di
mov di,offset chengji_tab
add di,ax
n10:
lodsb
cmp al,0dh
jz n20
stosb
jmp short n10
n20:
ret
intputname endp
intputgrade proc near
lea dx,grade_tab
mov ah,0ah
int 21h
call crlf
lea si,grade_tab + 2
mov ax,namecount
mov bx,20
mul bx
mov di,offset chengji_tab + 16
add di,ax
m10:
lodsb
cmp al,0dh
jz m20
stosb
jmp short m10
m20:
ret
intputgrade endp
change proc near
mov bx,0
mov ax,namecount
mov di,20
mul di
add ax,offset chengji_tab + 16
mov di,ax
newc:
mov al,[di]
sub al,30h
jl exit2
cmp al,9
jg exit2
cbw
xchg ax,bx
mov cx,10
mul cx
xchg ax,bx
add bx,ax
inc di
jmp newc
exit2:ret
change endp
printall proc near
lea dx,string5
mov ah,09
int 21h
mov bp,0
mov dx,offset chengji_tab
all10:
push dx
mov bx,2
mov ah,40h
mov cx,12
int 21h
mov si,dx
add si,16
mov bx,bp
shl bx,1
cmp ds:gradeall[bx],60
mov bl,1
jae all20
mov bl,4
all20:
push bp
mov bp,4
call print_color
call Crlf
pop bp
pop dx
inc bp
cmp bp,namecount
jae allx
add dx,20
jmp short all10
allx:
ret
printall endp
crlf proc near ;回车换行
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
ret
crlf endp
print_color proc near
push ax
push bx
push cx
push dx
push si
push di
push bp
mov ah,3
mov bh,0
int 10h ;get cursor position
re_print:
push dx ;save it
lodsb
mov ah,9
mov bh,0
mov cx,1
;mov bl,red_color
int 10h ;print 1 bytes with red color
pop dx ;restore cursor position
inc dl ; forward 1 byte ; 200
mov bh,0
mov ah,2 ;get new cursor position
int 10h
dec bp ;next bytes
jnz re_print
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
print_color endp
code ends
end start
十万火急 万分感谢