先看主程序
data segment
grade dw 10 dup(?) ;十个人的成绩
rank db 10 dup(?) ;存放十个人的名次
;提示信息
string db 'plaease input grades,separated by commas:',0dh,0ah,'$'
data ends
stack segment
dw 50 dup(?)
stack ends
code segment
assume ds:data,cs:code,ss:stack
main proc far
start:
mov ax,data
mov ds,ax
lea dx,string ;提示信息
mov ah,09h
int 21h
call inputGrade ;输入成绩
call outGrade ;输出成绩
call convert ;转化成二进制
call rankGrade ;排名
call outRank ;输出排名
mov ax,4c00h
int 21h
main endp
从上面可以看到主要功能为:

剩下程序有点长,因为涉及到ASCII码-BCD码-二进制之间的转换,还有DOS调用来完成键盘的输入与输出显示。
如下:
;输入成绩子程序
inputGrade proc
mov cx,10
lea si,grade
input:
mov ah,1
int 21h
mov [si],al
mov ah,1
int 21h
mov [si+1],al
mov ah,1
int 21h
add si,2
loop input
mov ah,2 ;换行
mov dl,0dh
int 21h
ret
inputGrade endp
;输出成绩子程序
outGrade proc
mov grade[si],'$'
lea si,grade
mov ah,2
mov dl,02h
int 21h
mov dl,0ah
int 21h
mov ah,9
mov dx,si
int 21h
ret
outGrade endp
;转换子程序
convert proc
lea si,grade
xor cx,cx
mov cx,20
begin:
mov al,[si]
sub al,30h ;ASCII转化为BCD码
mov [si],al
inc si
loop begin
lea si,grade ;BCD转化成二进制
lea di,grade
mov cx,000ah
c1:
mov al,[si]
mov dl,[si+1]
mov bl,al
shl bl,1
shl al,1
shl al,1
shl al,1
add al,bl
add al,dl
mov [di],al
add si,2
inc di
loop c1
ret
convert endp
;排名子程序
rankGrade proc
lea di,rank
mov ch,0ah ;外循环次数
xor bx,bx
next1:
lea si,grade
mov al,[si+bx] ;外循环一次AL也变化一次
mov dl,1 ;名次
mov cl,10 ;内循环次数每次外循环时刷新
next2:
cmp al,[si]
jnb check ;若第一个数大于等于 则不记名
inc dl ;若第一个数小于 名次+1
inc si
dec cl
jnz next2
jz next3
check:
inc si
dec cl ;内循环-1
jnz next2
next3:
mov [di],dl ;把名次放入
inc di
inc bx
dec ch
jnz next1
ret
rankGrade endp
;输出排名结果
outRank proc
xor cx,cx
mov cx,10
lea di,rank
mov ah,2
mov dl,02h
int 21h
mov dl,0ah
int 21h
outcom:
mov dl,[di]
add dl,30H ;转化为ASCII码
mov ah,02H
int 21h
mov dl,' '
mov ah,02h
int 21h
inc di
loop outcom
ret
outRank endp
code ends
end start
结果显示:

结果中有个冒号,这是因为在ASCII码没有10
冒号的ASCII码对应过来等价于10
汇编语言学生成绩管理系统
该博客介绍了使用汇编语言实现学生成绩的输入、排名及输出功能。程序涉及ASCII码、BCD码和二进制之间的转换,并通过DOS调用进行键盘输入和屏幕显示。最终结果显示成绩,由于ASCII码特性,结果中出现冒号。
414

被折叠的 条评论
为什么被折叠?



