您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 山东大学汇编语言上机实验――实验五
子程序设计2.6显示学生名次表rank编制一个程序,要求接受键盘输入的一个班的学生成绩,并存放于一个50字的grade数组中,其中grade+i保存学号为I+1的学生成绩。然后根据grade中的学生成绩,把学生成绩依次填入50字的rank数组中,其中rank+i的内容是学号为i+1的学生的名次。再按学号顺序把名次从终端上显示出来。本题要做的主要工作和例2.2的内容是完全一样的,只是增加了由用户键入学生成绩及输出学生名次两个部分的内容,因此这三个部分可以用子程序结构来完成。子程序结构划分的层次图如图2.17所示,可以看出,main为主要模块,其下一层的三个模块为程序的三大部分。现将各模块说明如下:1.模块名:main为总模块输入:从键盘输入一个班的学生成绩输出:显示一个班的学生成绩功能:根据输入的学生成绩,计算并显示学生名次。算法如下:一个学生名次等于成绩高于该学生的人数+1.2.模块名:input输入:以学号为序型键盘输入一个班的学生成绩。各个成绩之间用逗号隔开,最后以回车符号结束。输出:把一个班的学生成绩存入grade数组。功能:接受一个班的学生成绩。调用子模块decibin把键盘输入的一个十进制数转换为二进制数。调用子模块crlf完成回车,换行功能。3.模块名:rankp输入:从grade数组取得一个班的学生成绩。输出:以学号为序计算出该班每个学生的名次存入rank数组。功能:计算一个班的学生成绩。算法为:一个学生的名次等于成绩高于该生的学生人数加1.4,。模块名;output输入:把rank数组取得一个班的学生名次。输出:把一个班的学生名次以学号为序在总端上显示出来。功能:先是一个班的学生名次。调用子模块decibin把键盘输入的一个十进制数转换为二进制数。调用子模块crlf完成回车,换行功能。5:模块名:decilin输入:从键盘输入一个十进制数。输出:把该数转换成二进制数并存入BX寄存器中。功能:从键盘输入一个十进制数转换成二进制数并存入BX寄存器中。6.模块名:crlf输出:向终端发出回车换行符。功能:完成一次回车换行操作。7.模块名:binidec输入:从BX寄存器取得一个二进制数。输出:在终端屏幕显示一个十进制数。功能:把BX寄存器中的二进制数转换为十进制数,并在终端显示出来。调用子模块DCE_DIV用来作除法运算并显示字符。8.模块名:dec_div输入:从BX寄存器中的二进制数除以相应的十的幂,并在屏幕显示一位商。余数保存在BX寄存器中。有了以上的层次图及模块说明,对程序的全貌有了基本了解。在图2.18中,我们给出了除rankp以外的其余各个子程序的程序框图。Rankp的框图与图2.4相同。图2.19是程序清单,图2.20是本例的运行情况。;PROGRAMTITLEGOESHERE——Rank;**************************************************************************datareasegmentgradedw50dup(?)rankdw50dup(?)countdw?mess1db'Grade?$'mess2db13,10,'InputError!',13,10,'$'mess3db'Rank:$'datareaends;**************************************************************************prognamsegment;--------------------------------------------------------------------------mainprocfarassumecs:prognam,ds:datareastart:;setupstackforreturnpushdssubax,axpushax;setDSregistertocurrentdatasegmentmovax,datareamovds,ax;MAINPARTOFPROGRAMGOESHEREcallinputcallrankpcalloutputretmainendp;--------------------------------------------------------------------------inputprocnearleadx,mess1movah,09int21h;movsi,0movcount,0enter:calldecibininccountcmpdl,','jestorecmpdl,13jeexit2jneerrorstore:movgrade[si],bxaddsi,2jmpentererror:leadx,mess2movah,09int21hexit2:movgrade[si],bxcallcrlfretinputendp;--------------------------------------------------------------------------rankpprocnearmovdi,countmovbx,0loop1:movax,grade[bx]movwordptrrank[bx],0movcx,countleasi,gradenext:cmpax,[si]jgno_countincwordptrrank[bx]no_count:addsi,2loopnextaddbx,2decdijneloop1retrankpendp;--------------------------------------------------------------------------outputprocnearleadx,mess3movah,09int21h;movsi,0movdi,countnext1:movbx,rank[si]callbinidecmovdl,','movah,02int21haddsi,2decdijnznext1callcrlfretoutputendp;--------------------------------------------------------------------------decibinprocnear;proceduretoconverdecimalonkeybdtobinary.;resultisleftinBXregister.movbx,0;getdigitfromkeyboard,converttobinarynewchar:movah,1int21hmovdl,alsubal,30hjlexit1cmpal,9djgexit1cbw;(digitisnowinAX);multiplynumberinBXby10decimal.xchgax,bxmovcx,10dmulcxxchgax,bx;adddigitinAXtonumberinBXaddbx,axjmpnewcharexit1:retdecibinendp;--------------------------------------------------------------------------binidecprocnear;proceduretoconvertbinarynumberinBXtodecimal;onconsolescreenpushbxpushcxpushsipushdimovcx,100dcalldec_divmovcx,10dcalldec_divmovcx,1dcalldec_divpopdipopsipopcxpopbxretbinidecendp;--------------------------------------------------------------------------dec_divprocnear;sub_subroutinetodividenumberinBXybnumberinCX;printquotientonscreenmovax,bxmovdx,0divcxmovbx,dxmovdl,al;printthecontentsofDLonscreenadddl,30hmovah,02hint21hretdec_divendp;--------------------------------------------------------------------------crlfprocnear;printcarriagereturnandlinefeedmovdl,0ahmovah,02hint21h;movdl,0dhmovah,02hint21h;retcrlfendp;--------------------------------------------------------------------------prognamends;**************************************************************************endstart程序框图如下:实验截图如下:实验总结:在复杂的程序设计中,采用模块化结构可以划分功能、分界程序,使得程序有复杂变简单,变清晰。主程序和子程序之间嵌套使用,使得写代码时思路更清楚明白,读代码时方便快捷清晰明了。这点跟高级编程语言类似。而此程序中变量p可以跟踪并控制输入的人数、输名字要预留缓存区、十进制码要和二进制码间相互转换,这些又体现了编程低级语言的特点。学习汇编语言,重要的事掌握如何通过汇编指令和程序来控制计算机各个组成部件工作,完成一系列任务。因此,学习汇编用语言与学习高级语言的不同之处是要学习如何深入到计算机的内部进行控制。通过这次实验,加深了我对汇编语言的理解。每一步的输入、存储、转换、输出,都需要一条条的汇编指令执行。而且每一步都有自己的源和目标的地址,每个数据都有自己的存储空间和地址,我们可以很清晰的“跟踪”每一个数据的变化和地址的转移。实验体会:在复杂的程序设计中,采用模块化结构可以划分功能、分界程序,使得程序有复杂变简单,变清晰。主程序和子程序之间嵌套使用,使得写代码时思路更清楚明白,读代码时方便快捷清晰明了。这点跟高级编程语言类似。而此程序中变量p可以跟踪并控制输入的人数、输名字要预留缓存区、十进制码要和二进制码间相互转换,这些又体现了编程低级语言的特点。学习汇编语言,重要的事掌握如何通过汇编指令和程序来控制计算机各个组成部件工作,完成一系列任务。因此,学习汇编用语言与学习高级语言的不同之处是要学习如何深入到计算机的内部进行控制。通过这次实验,加深了我对汇编语言的理解。每一步的输入、存储、转换、输出,都需要一条条的汇编指令执行。而且每一步都有自己的源和目标的地址,每个数据都有自己的存储空间和地址,我们可以很清晰的“跟踪”每一个数据的变化和地址的转移。2.7计算工资scremp编写一个程序,接受用户输入的工作时间及工资率,显示计算得到的工资数。本程序有三个部分组成,输入工作时间和工资率,计算工资;显示工资值。在输入输出部分,与例2.6一样,必须考虑自负与数字的装换,以及十进制换二进制,二进制换十进制的问题。除此之外,还应注意到本例中的输入数可能是小数。在这里并不需要使用浮点数格式来进行计算,只是在计算中必须处理小数。我们采用在接受输入数字是记录小数点后的位数,并把两个输入数的小数点后位数之和存放在nodec单元当中。在计算工资的乘法中,并不考虑小数点后的存在,而输出的工资数又只取出小数点后的两位数,因此我们用SHIFT单元记录移位因子,用ADJUST单元记录舍入值。对于不同的NODEC可以分以下情况进行处理。1.NODEC6我们知道,对于16位整数而言,及其允许的最大数是65535,对于NODEC6的数,移位因子将=10000,该数已经超过机器允许的范围,因此本例限制NODE
本文标题:山东大学汇编语言上机实验――实验五
链接地址:https://www.777doc.com/doc-4797451 .html