当前位置: 代码迷 >> 汇编语言 >> 帮忙做一个汇编语言的题目。该如何解决
  详细解决方案

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

热度:6584   发布时间:2013-02-26 00:00:00.0
帮忙做一个汇编语言的题目。
编写汇编语言源程序实现:从键盘输入一组学生记录,包括:
(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
;-------------------------------------------------------------------------------;   子   程   序;-------------------------------------------------------------------------------;从键盘输入IDgetId 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        retgetId endp;-------------------------------------------------------------------------------;从键盘输入real_namegetName 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        retgetName 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        retgetScore 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        retcopyString endp;-------------------------------------------------------------------------------;输入新行newLine proc        push ax        push dx        mov ah,2        mov dl,0dh        int 21h        mov dl,0ah        int 21h        pop dx        pop ax        retnewLine 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                rettoBinary endp;-------------------------------------------------------------------------------;显示一个串;输入:dx = 输出串的首地址disp_string proc        push ax        mov ah,9        int 21h        pop ax        retdisp_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        retsort_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        retinsert 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        retdisp_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        retyes_no endp;-------------------------------------------------------------------------------;输入一个水平制表符h_tab proc        push ax        push dx        mov ah,2        mov dl,9        int 21h        pop dx        pop ax        reth_tab endp    end start
  相关解决方案