帮忙做一个汇编语言的题目。该如何解决

帮忙做一个汇编语言的题目。
编写汇编语言源程序实现:从键盘输入一组学生记录,包括:
(1) 学号: 10个十进制数字字符,如7100410130;
(2) 姓名: 最多8个英文字母,如;liming;
(3) 成绩:一字节二进制数,大小在十进制数0-100之间。
然后将记录按成绩从高到低的顺序排列后显示并保存到C盘根目录下的score.txt文本文件中。如输出排序记录: 
7100410130 liming 95
7100410120 wangwu 90
7100410145 zhangsan 88
要求:1. 有友好的输入输出提示;
  2. 有正确的输入判断;
  3.采用了子程序;
  4. 对源代码每行都有注释;


------解决方案--------------------
探讨
编写汇编语言源程序实现:从键盘输入一组学生记录,包括:
(1) 学号: 10个十进制数字字符,如7100410130;
(2) 姓名: 最多8个英文字母,如;liming;
(3) 成绩:一字节二进制数,大小在十进制数0-100之间。
然后将记录按成绩从高到低的顺序排列后显示并保存到C盘根目录下的score.txt文本文件中。如输出排序记录:
7100410130 liming 95
……

------解决方案--------------------
Assembly code

;-------------------------------------------
;   子   程   序
;-------------------------------------------
;从键盘输入ID
getId proc
        push ax
        push dx
        mov ah,9
        mov dx,offset enter_id
        int 21h               ;输入提示
        mov [buf_max],11      ;最多输入10个有效字符
        mov dx,offset buf_max
        mov ah,0ah
        int 21h
        pop dx
        pop ax
        ret
getId endp
;-------------------------------------------
;从键盘输入real_name
getName proc
        push ax
        mov ah,9
        mov dx,offset enter_name
        int 21h
        mov [buf_max],9
        mov dx,offset buf_max
        mov ah,0ah
        int 21h
        pop ax
        ret
getName endp
;-------------------------------------------
getScore proc
        push ax
        mov ah,9
        mov dx,offset enter_score
        int 21h
        
        mov [buf_max],4
        mov dx,offset buf_max
        mov ah,0ah
        int 21h
        
        pop ax
        ret
getScore endp
;-------------------------------------------
;拷贝串
;输入:di = 目标缓冲区首地址
copyString proc
        push si
        push di
        push cx
        
        mov si,offset chars
        xor cx,cx
        mov cl,count
        rep movsb

        pop cx
        pop di
        pop si
        ret
copyString endp
;-------------------------------------------
;输入新行
newLine proc
        push ax
        push dx
        mov ah,2
        mov dl,0dh
        int 21h
        mov dl,0ah
        int 21h
        pop dx
        pop ax
        ret
newLine endp
;-------------------------------------------
;将十进制串转换为二进制值
;输入:si = 数字串地址
;输出:ax(或者al) = 转换后的数
toBinary proc
        push bx
        push cx
        push dx
        push si
        
        xor bx,bx
        mov si,offset chars
@@10:
        mov al,[si]     ;接收一个字符
        cmp al,0dh
        jz @@20
        
        mov ah,0        ;把AH清0,以配合AL
        sub al,'0'      ;脱衣
        
        ;bx是前n次ax加权累加和,如果要与本次的ax相加,则必须先乘以10
        shl bx,1        ;初始值为0,第二次是乘以2
        mov dx,bx       ;存dx中
        mov cl,2        ;
        shl bx,cl       ;bx * 4 ,但初始为0(这一步是实现上一次的值乘以8)
        add bx,dx       ;初始0,(再与上一次的二倍相加,完成乘以10的任务)
        
        add bx,ax       ;bx初始为ax(再加上这一次)
        inc si
        jmp @@10
        
@@20:
        mov ax,bx
        pop si
        pop dx
        pop cx
        pop bx
        
        ret
toBinary endp
;-------------------------------------------
;显示一个串
;输入:dx = 输出串的首地址
disp_string proc
        push ax
        mov ah,9
        int 21h
        pop ax
        ret
disp_string endp
;-------------------------------------------
;排序(插入法)
;备注:本子程序是用插入法,根据学生的score,从高分到低分,
;依序将其所在记录的地址插入地址索引表

sort_score proc
        push ax
        push bx
        push si
        push di
        
        mov bx,offset students          ;bx=记录首地址
        mov di,offset sortByScore       ;di=地址索引表首地址
        mov cx,rec_count                ;cx=实际建立的记录数
@@10:
        mov al,(STUDENT ptr [bx]).score ;逐一取成绩
        call insert                     ;插入地址索引表
        add bx,19  ;每条记录长19字节,指向下一条记录
        add di,2   ;地址索引表每个结点占2个字节
        loop @@10  ;没扫描完就继续
        
        pop di
        pop si
        pop bx
        pop ax
        ret
sort_score endp

;-------------------------------------------
;有序插入(是将记录的地址插入按照score的高低,依序插入地址索引表)
;输入:di = 地址索引表变址(它指向最后一个插入的数据后面的空位置)
;      bx = 当前记录首地址
;      al = 比较因子(即score)

insert proc
        push bx
        push dx
        push di
        
        mov dx,bx       ;dx = bx = 持当前记录地址
@@10:
        mov bx,[di-2]   ;取出索引结点保存的记录地址给bx
        cmp bx,0ffffh   ;=0ffffh吗(是0ffffh说明是根插入)
        jnz @@20        ;!=0ffffh 说明不是根插入,跳
        mov [di],dx     ;否则为根插入
        jmp @@99        ;退出
@@20:
        cmp al,(STUDENT ptr [bx]).score
        ja @@30  ;
        mov [di],dx     ;否则是小于,那就放当前位置
        jmp @@99        ;退出
@@30:
        mov [di],bx     ;索引结点内容后移
        sub di,2
        jmp @@10

@@99:
        pop di
        pop dx
        pop bx
        ret
insert endp
;-------------------------------------------
;子程序:将二进制值转换为十进制数串并输出
;输入:ax=要转换并输出的数
;输出:在屏幕上显示bx中的数
;-------------------------------------------
disp_number proc near
        push cx
        push ax
        push dx
        push bx

        ;mov ax,bx  ;把要转换的数赋给ax,作为被除数
        mov bx,10  ;着bx作为除数
        xor cx,cx  ;着cx作为压栈记数器
@@10:
        xor dx,dx ;清0,以便配合ax做除法
        div bx    ;dx:ax / 10
        push dx   ;余数压栈
        inc cx    ;记数器记下压栈的次数
        cmp ax,0 ;商为0则完成转换
        jnz @@10
@@20:
        pop dx
        add dl,'0'    ;30h
        mov ah,2h
        int 21h
        loop @@20
        
        pop bx
        pop dx
        pop ax
        pop cx
        ret
disp_number endp

;-------------------------------------------
;询问用户是否继续输入
;输出:为jc跳转设置条件
;
yes_no proc
        push dx
        push ax
        call newLine
        mov dx,offset yesno
        mov ah,9
        int 21h
        
        mov ah,1
        int 21h
        cmp al,'y'
        jz @f
        cmp al,'Y'
        jz @f
        jmp @@20
@@:
        clc
        jmp @@99
@@20:
        stc
@@99:
        pop ax
        pop dx
        ret
yes_no endp
;-------------------------------------------
;输入一个水平制表符
h_tab proc
        push ax
        push dx
        mov ah,2
        mov dl,9
        int 21h
        pop dx
        pop ax
        ret
h_tab endp
    end start