帮忙做一个汇编语言的题目。该如何解决
帮忙做一个汇编语言的题目。
编写汇编语言源程序实现:从键盘输入一组学生记录,包括:
(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
7100410120 wangwu 90
7100410145 zhangsan 88
要求:1. 有友好的输入输出提示;
2. 有正确的输入判断;
3.采用了子程序;
4. 对源代码每行都有注释;
------解决方案--------------------
------解决方案--------------------
- 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