编写汇编语言源程序实现:从键盘输入一组学生记录,包括:
(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
;-------------------------------------------------------------------------------; 子 程 序;-------------------------------------------------------------------------------;从键盘输入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