学生信息管理程序汇编语言_第1页
学生信息管理程序汇编语言_第2页
学生信息管理程序汇编语言_第3页
学生信息管理程序汇编语言_第4页
学生信息管理程序汇编语言_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、;学生信息管理程序 汇编语言.model small.stack 200h.data;small,程序只 能有一个代码段和一个数据段;堆栈段名stack,默认大小1024字节,这里是 200h字节;数据段名_data student struc ;学生的数据结构,32字节,25,便于计算地址xname db 14 dup('$') ;为保存1位小数,以10倍值保存class db 14 dup('$')num dw 0score dw 0 student ends stu_size equ 32 ;32=25stu_db student 100 dup(<

2、'x','y',6,500>);100名学生的空间stu_num db 0;已保存的学生人数stu_seq db 100 dup('$');排序信息welcome db '=Student Information Mannagement System=',0dh,0ah; db '0. Add student.',0dh,0ah ;输入成绩 db '1. Sort by number.',0dh,0ah;按学号排序 db '2. Sort by score.',0dh,0ah;

3、按成绩排序 db '3. Average score',0dh,0ah;统计平均成绩 db '4. Show Statistics.',0dh,0ah;显示各分段人数 db '5. Exit.',0dh,0ah;退出 db '$'msg1 db 'name:','$'msg2 db 'class:','$'msg3 db 'number:','$'msg4 db 'score:','$'m_str_l d

4、b 0dh,0ah,'length<14byte','$'m_num_l db 0dh,0ah,'value<100','$' table dw CASE0,CASE1,CASE2,CASE3,CASE4,CASE5buflen db 100 ;输入缓冲区大小100aclen db ? ;实际输入长度buf db 100 dup(0),'$' ;实际缓冲区bufrear equ offset buf+100;缓冲区尾ns6 db 0;用于统计各分数段人数n67 db 0n78 db 0n89 db 0n

5、91 db 0 ms6 db 'failed: ','$'显示各分数段人数m67 db '6070 : ','$'m78 db '7080 : ','$'m89 db '8090 : ','$'m91 db '90100: ','$'.CODESTART:ps macro str ;打印字符串,要求以'$'结尾push axpush dxlea dx,strmov ah,9int 21hpop dxpop axendmp

6、c macro ch;打印字符push axpush dxmov dl,chmov ah,2 int 21hpop dxpop axendmendl macro;打印 'n'pc 0dhpc 0ahendmscs macro;从键盘输入字符串,保存在buf中,串长aclenlea dx,buflenmov ah,10int 21hendmscc macro;从键盘输入字符,保存在almov ah,1int 21hendmmemcpy macro dest,src,len;经典的内存拷贝push axpush cxpush sipush dimov ax,dsmov es,ax;

7、串操作di要用到附加段mov cl,lenmov ch,0lea si,srclea di,destcldrep movsb;mov di,'$'pop dipop sipop cxpop axendm ;使 bx指向编号为ax的学生单元;寄存器:ax,bx,cxGET_STU macropush axpush cxlea bx,stu_dbmov cl,5shl ax,cladd bx,ax ;bx指向这个学生的存储单 元pop cxpop axendmmov ax,datamov ds,axWELC:endlps welcomepc ':'输入选项scc;a

8、scii码保存在 alendlmov ah,0mov bx,axsub bx,'0'cmp bx,5jbe CASE0TO5jmp WELCCASE0TO5:shl bx,1jmp tablebx;基址寻址CASE0:;录入学生成绩(十进制形式)call ins_stujmp WELCCASE1:;按学号排序显 示call num_sortcall print_seq jmp WELCCASE2:;按成绩排序显示call score_sortcall print_seqjmp WELCCASE3:;统计平均成绩call get_averagejmp WELCCASE4:;统计各

9、分数段人数call get_satjmp WELCCASE5: ;退出mov ah,4chint 21h;ins_stu:输入学生信息;入口:stu_num已 有学生人数,即最 新空白编号;出口:stu_db;存储单元:stu_db,stu_numins_stu proc nearpush axpush bxpush cxpush dxmov al,stu_nummov ah,0;确定存 放在 第几个位 置lea bx,stu_dbmov cl,5shl ax,cladd bx,ax;bx指向空白单元input_name:ps m_str_lps msg1scscmp aclen,14jae

10、input_namememcpy (student ptr bx).xname,buf,aclenendlinput_class:ps m_str_lps msg2scscmp aclen,14jae input_classmemcpy (student ptr bx).class,buf,aclenendlps m_num_lps msg3scscall str2nummov (student ptr bx).num,axendlps m_num_lps msg4scscall score_fmtmov (student ptr bx).score,axendlinc stu_num;增加学

11、生记录pop dxpop cxpop bxpop axretins_stu endp;pnum:以十进制形式输出一个无符号数;入口:ax需要输出的正数;出口:;存储单元:pnum proc nearpush axpush bxpush cxpush dxmov bx,bufreardec bx;mov (student ptr bx), '$'mov byte ptr bx, '$'OUTLOOP:or ax,axjz OUTLOOPFIN;ax为零mov dx,0mov cx,10div cxadd dl,'0'dec bxmov byte p

12、tr bx,dljmp OUTLOOPOUTLOOPFIN:cmp bx,offset bufrear-1 ;输出0jne PRINT_NUMdec bxmov BYTE ptr bx,'0'PRINT_NUM:mov dx,bxmov ah,9int 21hpop dxpop cxpop bxpop axretpnum endp;pscore:以十进制形式输出 带一位小数的分数;入口:ax需要输出的正数;出口:;存储单 元:pscore proc nearpush axpush bxpush cxpush dxmov bx,bufrearOUTLOOP2:or ax,axjz

13、 OUTLOOPFIN2mov dx,0mov cx,10div cxadd dl,'0'dec bxmov byte ptr bx,dljmp OUTLOOP2OUTLOOPFIN2:cmp bx,offset bufrear-1;x要改成0x,以便小数格式输出je S0Xcmp bx,offset bufrear;空要改成00,以便小数格式输出jne PRINT_SCORES00:;=,为空dec bxmov BYTE ptr bx,'0'S0X:dec bxmov BYTE ptr bx,'0'PRINT_SCORE:mov dx,bxmo

14、v bx,bufreardec bxmov cl,bx;暂存小数mov byte ptr bx,'$'mov dx,bxmov ah,9int 21hpc '.'pc clpop dxpop cxpop bxpop axretpscore endp ;pstu:输出学生信息;入口:ax存储编号;出口:;存储单 元:pstu proc nearpush axpush bxpush cxGET_STUps msg1ps (student ptr bx).xname;pc ' 'ps msg2ps (student ptr bx).classpc &#

15、39; 'ps msg3mov ax, (student ptr bx).numcall pnumpc ' 'ps msg4mov ax, (student ptr bx).scorecall pscoreendlpop cxpop bxpop axretpstu endp;str2num:将数字由字符串转成数值;入口:buf;出口:ax;存储单 元:buf缓冲区,aclen缓冲区内容长 度str2num procpush bxpush cxpush simov ax,0mov cl,aclenmov ch,0lea si,bufGET_NUM:;mov ax,dest

16、;add dest,dest*10 + si-'0'mov bl,10mul bl;以前的数 *10,乘法指令必须用axmov bl,simov bh,0add ax,bxsub ax,'0'inc siloop GET_NUMpop sipop cxpop bxretstr2num endp;score_fmt:将分数格式存储;入口:buf;出口:ax;存储单 元:buf缓冲区,aclen缓冲区内容长 度score_fmt procpush bxpush cxpush dxpush simov ax,0mov cl,aclenmov ch,0mov dx,0l

17、ea si,bufGET_SCORE:cmp BYTE ptr si,'.' ;这个类型很重要jnz MUL_DEX;不是小数点mov dx,1;发现小数点inc siloop GET_SCORE MUL_DEX:mov bl,10mul blmov bl,simov bh,0add ax,bxsub ax,'0'inc siloop GET_SCOREcmp dx,0jnz END_SCOREmov bl,10mul blEND_SCORE:pop sipop dxpop cxpop bxretscore_fmt endp;get_average:算平均分并输

18、出;入口:stu_db;出口;存储单 元:stu_db,stu_numget_average proc nearpush axpush bxpush cxpush dxmov cx,0;学生编号mov ax,0;暂存平均成绩低8位mov dx,0;暂存平均成绩高8位REPERT:cmp cl,stu_numjae OUT_PUT;总分已 经加完了;找到编号为 cx的学生push axpush cxmov ax,cxGET_STUpop cxpop axadd ax, (student ptr bx).score ;32位加法adc dx,0inc cljmp REPERTOUT_PUT:mov

19、 cl,stu_nummov ch,0or cl,0;假设学生人数不多于255人jnz END_AVE;没有学生,不能除0inc cxEND_AVE:div cx;扩展为16位除法,商保存在 ax中endlcall pscoreendlpop dxpop cxpop bxpop axretget_average endp;get_sat:统计各分数段人数并输出;入口:stu_db;出口;存储单 元:ns6,n67,n78,n89,n91,stu_db,stu_numget_sat proc nearpush axpush bxpush cx mov ns6,0mov n67,0mov n78,

20、0mov n89,0mov n91,0mov cx,0;学生编号(人数-1)SAT_IN:cmp cl,stu_numjae SAT_OUT;已经完了;找到编号为 cx的学生push axpush cxmov ax,cxGET_STUpop cxpop axinc clmov ax, (student ptr bx).scorecmp ax,600jb IS6cmp ax,700jb I67cmp ax,800jb I78cmp ax,900jb I89;>=90inc n91jmp SAT_INIS6:inc ns6jmp SAT_INI67:inc n67jmp SAT_INI78:

21、inc n78 jmp SAT_INI89:inc n89jmp SAT_INSAT_OUT:mov ah,0ps ms6mov al,ns6call pnumendlps m67mov al,n67call pnumendlps m78mov al,n78call pnumendlps m89mov al,n89call pnumendlps m91mov al,n91call pnumendlpop cxpop bxpop axretget_sat endp;print_seq:根据序列 stu_seq输出列表;输入:stu_seq;输出:;存储单 元:stu_seqprint_seq p

22、roc nearpush axpush bx;stu_seq保存了编号序列,以'$'结束lea bx,stu_seqPRINT_SEQ_BEGIN:mov al,bxcmp al,'$'jz PRINT_SEQ_ENDmov ah,0call pstuinc bxjmp PRINT_SEQ_BEGINPRINT_SEQ_END:pop bxpop axretprint_seq endp;num_sort:按学号排序;输入:stu_seq;输出:stu_seq;存储单 元:num_sort proc nearpush bxpush dxmov dl,0lea bx

23、,stu_seqSORT_BEGIN:cmp dl,stu_numjae SORT_ENDmov BYTE ptr bx,dlinc bxinc dljmp SORT_BEGINSORT_END:movBYTE ptr bx,'$' ;stu_seq保存了按输入顺序的序列,以 '$'结束cmp stu_num,1;学生数小于等于1,没必要排序jle NON_NUMmov cl,stu_num;循环次数,内存量 不能直接减dec clmov ch,0LOOP1:mov di,cx;暂存外循环cx;指向第一个序号lea bx,stu_seqLOOP2:mov al,

24、BYTE ptr bxmov ah,0push bxGET_STUmov dx, (student ptr bx).numpop bx;dx前一个序列号对 应的学号mov al,BYTE ptr bx+1push bxGET_STUcmp dx, (student ptr bx).num;bx.num后一个序列号对 应的学号pop bxjae CONTImov al,BYTE ptr bx;小于则交换两个序列号;call pnum;endlxchg al,BYTE ptr bx+1;call pnum;endlmov BYTE ptr bx,alCONTI:inc bx;下一个序列号loop LOOP2mov cx,di;恢复外循环loop LOOP1NON_NUM:pop dx po

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论