北京邮电大学计算机学院《微机原理与接口技术》学生信息管理系统实验报告姓名:许伟林学号:08211306指导教师: 倪晖日期:2010/12/221/28内容目录一、实验目的...................................................................3二、实验环境...................................................................3三、实验任务...................................................................3四、实验设计...................................................................3四.一、关键数据结构.........................................................3学生信息..................................................................3排序序列..................................................................4菜单跳转表................................................................4四.二、关键子程序和宏定义...................................................4部分宏定义................................................................4部分子程序................................................................5四.三、子程序调用关系图.....................................................50、输入学生信息...........................................................51、按学号排序输出.........................................................62、按成绩排序输出.........................................................63、统计并输出平均成绩.....................................................64、统计并输出各分数段人数.................................................6四.四、程序源代码...........................................................6五、程序运行效果..............................................................25六、实验总结..................................................................282/28一、实验目的掌握8086汇编程序设计的基本方法了解用汇编语言写程序的麻烦,坚定学好高级语言的信心二、实验环境WindowsXPMASMPlus1.2集成实验环境三、实验任务编写学生信息管理系统,详细要求见课本119页。四、实验设计四.一、关键数据结构学生信息studentstruc;学生的数据结构,32字节,2^5,便于计算地址xnamedb14dup('$')classdb14dup('$')numdw0scoredw0;为保存1位小数,以10倍值保存3/28studentendsstu_sizeequ32;32=2^5stu_dbstudent100dup('x','y',6,500);100名学生的空间stu_numdb0;已保存的学生人数学生信息结构体长32字节,即2^5,便于计算地址。姓名和班级以字符串保存,限长13字节;学号和成绩以16位整数保存。为精确到1位小数,成绩域保存的是真实成绩的10倍值。程序申请了保存100名学生信息的连续内存空间,并以stu_num变量记录已输入的学生人数。排序序列stu_seqdb100dup('$');排序信息,排序操作在序列中进行,排序结果体现在序列中为避免排序操作对学生信息数据做移动,程序使用一个序列来存储排序信息。排序开始前,序列根据学生人数stu_num初始化为01234……,排序过程中只移动stu_seq序列中的数值,最后按数值顺序,定位到stu_db中的学生信息地址输出学生信息。菜单跳转表welcomedb'==StudentInformationMannagementSystem==',0dh,0ah;打印菜单db'0.Addrecord.',0dh,0ah;0.录入学生成绩(十进制形式)db'1.Sortbynumber.',0dh,0ah;1.按学号排序显示db'2.Sortbyscore.',0dh,0ah;2.按成绩排序显示db'3.ShowAverage',0dh,0ah;3.统计平均成绩db'4.ShowStatistics.',0dh,0ah;4.统计各分数段人数db'5.Exit.',0dh,0ah;5.退出db'$'tabledwCASE0,CASE1,CASE2,CASE3,CASE4,CASE5程序通过bx寄存器方便地实现菜单跳转。四.二、关键子程序和宏定义部分宏定义宏名称功能Ps打印字符串pc打印字符4/28end打印'\n'转行scs从键盘输入字符串scc从键盘输入字符memcpy与c语言的memcpy完全一致部分子程序子程序名称功能ins_stu录入学生信息。判断输入字符串长度以避免缓冲区溢出。score_sort根据成绩对学生排序。num_sort根据学号对学生排序。print_seq按序列输出学生信息。get_average算平均分并输出。get_sat统计分数段并输出。str2num将学号由字符串形式转为整数形式。score_fmt将成绩由字符串形式转为10倍整数形式。智能处理小数点。pscore将10倍整数形式的成绩按小数格式输出。pnum输出10进制数字pstu输出学生信息,入口:ax存储学生编号四.三、子程序调用关系图0、输入学生信息5/28ins_stustr2numscore_fmt1、按学号排序输出2、按成绩排序输出3、统计并输出平均成绩4、统计并输出各分数段人数四.四、程序源代码;纪念我的第一个汇编程序;学生信息管理系统;——微机原理与接口技术作业6/28num_sortprint_seqpstuscore_sortprint_seqpstuget_averagepscoreget_satpnum;北京邮电大学计算机学院;许伟林;usa911atbupt.edu.cn;2010.12,14.modelsmall;small,程序只能有一个代码段和一个数据段.stack200h;堆栈段名stack,默认大小1024字节,这里是200h字节.data;数据段名_datastudentstruc;学生的数据结构,32字节,2^5,便于计算地址xnamedb14dup('$')classdb14dup('$')numdw0scoredw0;为保存1位小数,以10倍值保存studentendsstu_sizeequ32;32=2^5stu_dbstudent100dup('x','y',6,500);100名学生的空间stu_numdb0;已保存的学生人数stu_seqdb100dup('$');排序信息,排序操作在序列中进行,排序结果体现在序列中welcomedb'==StudentInformationMannagementSystem==',0dh,0ah;打印菜单db'0.Addrecord.',0dh,0ah;0.录入学生成绩(十进制形式)db'1.Sortbynumber.',0dh,0ah;1.按学号排序显示db'2.Sortbyscore.',0dh,0ah;2.按成绩排序显示db'3.ShowAverage',0dh,0ah;3.统计平均成绩db'4.ShowStatistics.',0dh,0ah;4.统计各分数段人数db'5.Exit.',0dh,0ah;5.退出db'$'msg1db'name:','$'msg2db'class:','$'msg3db'number:','$'msg4db'score:','$'m_str_ldb0dh,0ah,'[length14byte]','$'m_num_ldb0dh,0ah,'[value100]','$'7/28tabledwCASE0,CASE1,CASE2,CASE3,CASE4,CASE5buflendb100;输入缓冲区大小100aclendb?;实际输入长度bufdb100dup(0),'$';实际缓冲区bufrearequoffsetbuf+100;缓冲区尾ns6db0;统计各分数段人数n67db0n78db0n89db0n91db0ms6db'failed:','$';显示各分数段人数m67db'60~70:','$'m78db'70~80:','$'m89db'80~90:','$'m91db'90~100:','$'.CODE;代码段名_textSTART:psmacrostr;打印字符串,要求以'$'结尾pushaxpushdxleadx,strmovah,9int21hpopdxpopaxendmpcmacroch;打印字符pushaxpushdxmovdl,chmovah,28/28int21hpopdxpopaxendmendlmacro;打印'\n'pc0dhpc0ahendmscsmacro;从键盘输入字符串,保存在buf中,串长aclenleadx,buflenmovah,10int21hendmsccmacro;从键盘输入字符,保存在almovah,1int21hendmmemcpymacrodest,src,len;经典的内存拷贝pushaxpushcxpushsipushdimovax,dsmoves,ax;串操作di要用到附加段movcl,lenmovch,0leasi,srcleadi,destcldrepmovsb;mov[di],'$'popdipopsipopcxpopaxendm9/28;使bx指向编号为ax的学生单元;寄存器:ax,bx,cxGET_STUmacropushaxpushcxleabx,stu_dbmovcl,5shlax,claddbx,ax;bx指向这个学生的存储单元popcxpopaxendmmovax,@datamovds,axWELC:endlpswelcomepc':';输入选项scc;ascii码保存在alendlmovah,0movbx,axsubbx,'0'cmpbx,5jbeCASE0TO5jmpWELCCASE0TO5:shlbx,1jmptable[bx];基址寻址CASE0:;录入学生成绩(十进制形式)callins_stujmpWELCCASE1:;按学号排序显示callnum_sortcallprint_seq10/28jmpWELCCASE2:;按成绩排序显示callscore_sortcallprint_seqjmpWELCCASE3:;统计平均成绩callget_averagejmpWELCCASE4:;统计各分数段人数callg