



版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
子程序设计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;--------------------------------------------------------------------------main procfarassumecs:prognam,ds:datareastart:;setupstackforreturnpushdssubax,axpushax;setDSregistertocurrentdatasegmentmovax,datareamovds,ax;MAINPARTOFPROGRAMGOESHEREcall inputcall rankpcall outputretmain endp;--------------------------------------------------------------------------input procnearlea dx,mess1movah,09int 21h;movsi,0movcount,0enter:call decibininc countcmpdl,','je storecmpdl,13je exit2jne errorstore:movgrade[si],bxaddsi,2jmpentererror:lea dx,mess2movah,09int 21hexit2:movgrade[si],bxcall crlfretinput endp;--------------------------------------------------------------------------rankp procnearmovdi,countmovbx,0loop1:movax,grade[bx]movwordptrrank[bx],0movcx,countlea si,gradenext:cmpax,[si]jg no_countinc wordptrrank[bx]no_count:addsi,2loopnextaddbx,2decdijne loop1retrankp endp;--------------------------------------------------------------------------output procnearlea dx,mess3movah,09int 21h;movsi,0movdi,countnext1:movbx,rank[si]call binidecmovdl,','movah,02int 21haddsi,2decdijnz next1call crlfretoutput endp;--------------------------------------------------------------------------decibin procnear;proceduretoconverdecimalonkeybdtobinary.;resultisleftinBXregister.movbx,0;getdigitfromkeyboard,converttobinarynewchar:movah,1int 21hmovdl,alsubal,30hjl exit1cmpal,9djg exit1cbw;(digitisnowinAX);multiplynumberinBXby10decimal.xchgax,bxmovcx,10dmulcxxchgax,bx;adddigitinAXtonumberinBXaddbx,axjmpnewcharexit1: retdecibin endp;--------------------------------------------------------------------------binidec procnear;proceduretoconvertbinarynumberinBXtodecimal;onconsolescreenpushbxpushcxpushsipushdimovcx,100dcall dec_divmovcx,10dcall dec_divmovcx,1dcall dec_divpopdipopsipopcxpopbxretbinidec endp;--------------------------------------------------------------------------dec_div procnear;sub_subroutinetodividenumberinBXybnumberinCXprintquotientonscreenmovax,bxmovdx,0divcxmovbx,dxmovdl,al;printthecontentsofDLonscreenadddl,30hmovah,02hint 21hretdec_div endp;--------------------------------------------------------------------------crlf procnear;printcarriagereturnandlinefeedmovdl,0ahmovah,02hint 21h;movdl,0dhmovah,02hint 21h;retcrlf endp;--------------------------------------------------------------------------prognamends;**************************************************************************endstart程序框图如下:实验截图如下:实验总结:在复杂的程序设计中,采用模块化结构可以划分功能、分界程序,使得程序有复杂变简单,变清晰。主程序和子程序之间嵌套使用, 使得写代码时思路更清楚明白, 读代码时方便快捷清晰明了。这点跟高级编程语言类似。而此程序中变量p可以跟踪并控制输入的人数、输名字要预留缓存区、十进制码要和二进制码间相互转换,这些又体现了编程低级语言的特点。学习汇编语言,重要的事掌握如何通过汇编指令和程序来控制计算机各个组成部件工作,完成一系列任务。因此,学习汇编用语言与学习高级语言的不同之处是要学习如何深入到计算机的内部进行控制。通过这次实验,加深了我对汇编语言的理解。每一步的输入、存储、转换、输出,都需要一条条的汇编指令执行。而且每一步都有自己的源和目标的地址,每个数据都有自己的存储空间和地址,我们可以很清晰的“跟踪”每一个数据的变化和地址的转移。实验体会:在复杂的程序设计中,采用模块化结构可以划分功能、分界程序,使得程序有复杂变简单,变清晰。主程序和子程序之间嵌套使用,使得写代码时思路更清楚明白,读代码时方便快捷清晰明了。这点跟高级编程语言类似。而此程序中变量p可以跟踪并控制输入的人数、输名字要预留缓存区、十进制码要和二进制码间相互转换,这些又体现了编程低级语言的特点。学习汇编语言,重要的事掌握如何通过汇编指令和程序来控制计算机各个组成部件工作,完成一系列任务。因此,学习汇编用语言与学习高级语言的不同之处是要学习如何深入到计算机的内部进行控制。通过这次实验,加深了我对汇编语言的理解。每一步的输入、存储、转换、输出,都需要一条条的汇编指令执行。而且每一步都有自己的源和目标的地址,每个数据都有自己的存储空间和地址,我们可以很清晰的“跟踪”每一个数据的变化和地址的转移。2.7计算工资 scremp编写一个程序,接受用户输入的工作时间及工资率,显示计算得到的工资数。本程序有三个部分组成,输入工作时间和工资率,计算工资;显示工资值。在输入输出部分,与例2.6一样,必须考虑自负与数字的装换,以及十进制换二进制,二进制换十进制的问题。除此之外,还应注意到本例中的输入数可能是小数。在这里并不需要使用浮点数格式来进行计算,只是在计算中必须处理小数。我们采用在接受输入数字是记录小数点后的位数,并把两个输入数的小数点后位数之和存放在nodec单元当中。在计算工资的乘法中,并不考虑小数点后的存在,而输出的工资数又只取出小数点后的两位数,因此我们用SHIFT单元记录移位因子,用ADJUST单元记录舍入值。对于不同的NODEC可以分以下情况进行处理。1.NODEC>6我们知道,对于16位整数而言,及其允许的最大数是65535,对于NODEC>6的数,移位因子将>=10000,该数已经超过机器允许的范围,因此本例限制NODEC的值必须<=6.如果NODEC>6,则作为溢出处理,此时将输出值变为0。2.NODEC=3~6此时移位因子 SHIFT=(10)^nodec—2舍入值 ADJUST=1/2SHIFT例如:输入工作时间为 8.52,工资率为10.25,则乘机为Product=852X1025=873300移位因子为 shift=(10)^nodec—2舍入值 ADJUST=1/2SHIFT=50作舍入及移位处理Product+adjust)/shift=(873300+50)/100=8733又如:输入工作时间为 65.245,工资率为8.52则, product=65245X852=55588740SHIFT=(10)^5-2=1000Adjust=500作舍入及移位处理55588740+500/1000=55589240/1000=55589金处理的值只是取得了答案的有效值,并未考录小数点的位置,这个问题将会在输出时得到解决。3.NODEC=0~2在这种情况下,乘积的结果不必做舍入及移位处理,只需记录NODEC的值,并在输出显示是解决小数点的问题即可在计算时还需啊哟说明一个问题:由于采用整数运算,要求输入数不超过6535,任意输入数超过改制就做溢出处理,在这里我们用输出0来表示。此外,两个输入数的成绩可能得到三十二位二进制数的结果,这用一般的运算乘法指令就可以得到。对于这样的双精度数作除法运算时,尽管我们已经限制 shift的值不超过65535,但字运算的出发指令要求双精度被除数和单精度的除数相除,其结果应该是双精度的商,否则作为溢出处理。为了避免这种溢出情况的发生, 我们采用以下程序段来作为除法。 设在以下程序段运行前,我们已取得双精度被除数在DX:AX中,除数在shift单元中,除法运算结果的商在 DX,AX中。模块名:begin为中控制模块hour和工资rate输入:接受从键盘输入的工作时间输出:在屏幕上显示工资值 wage功能:根据工作时间和工资率计算工资Wage=hour*rate调用:2:模块名:Q10SCR功能:清除屏幕3:模块名:Q20CURS功能:置于光标位置4模块名:B10inpt输入:接受从键盘输入的以小时为单位的工作时间及工资率输出:把工作时间缓存HASPAR缓存区,吧工资率存入ratepar缓冲区功能:接受从键盘输入的工作时间及工资率,分别存入相应的缓存区中。5模块名:D10HOUR输入:从HRSPAR中取出工作时间输出:把转换为二进制的时间存入 BINHRS单元中。功能:调用子过程 M10ASBI,把工作时间从 ASCLL吗转换为二进制数。6模块名:E10RATE输入:从RATEPAR中取出工资率。输出:把转换为二进制的工资率存入 BINRATE单元中。功能:调用子过程 M10ASBI,把工资率从 ASCLL码转换为二进制数。7:模块名:M10ASBI输入:根据调用过程给出的指针以及字符个数取得一个ASCLL字符窜、输出:将ASCLL字符窜转换为二进制数,结果存放与BINAL单元中功能:把ASCLL字符窜转换为二进制数。同时记录输入的小数点后的位数累计在NODEC单元中。8:模块名:F10MULT输入:从binHRAS中取得工作时间,从 BINRATE中取得工资率。输出:根据工作时间及工资率的取值将其结果存放在 DX,AX中功能:把工作时间和工资率的成绩经过舍入和移位处理后得到的二进制工资值存放在DX.:AX中。9模块名:G10WAGE输入:DX,AX中的二进制工资数以及 NODEC单元中的小数点后的位数输出:把二进制的工资数转换为 ASCLL码存放在ASCWAGE为首地址的字符窜当中功能:模块名输入:ASCWAGE中的字符窜输出:把字符窜在屏幕上显示出来功能:显示工资数;PROGRAMTITLEGOESHERE--SCREMP;Enterhours&rate,displaywage;*************************************stacksgsegmentparastack'stack'dw32dup(?)stacksgends;*************************************datasg segmentpara 'data'hrsparlabelbyte;Hoursparameterlist;maxhlendb6acthlendb?hrsflddb6dup(?)rateparlabelbyte;rateparameterlist;maxrlendb6actrlendb?rateflddb6dup(?)messg1db 'Hoursworked?','$'messg2db 'Rateofpay?','$'messg3db 'Wage='ascwagedb 14dup(30h),13,10,'$'messg4db13,10,'Overflow!',13,10,'$'adjustdw?binvaldw0binhrsdw0binratedw0coldb0decinddb0mult10dw01nodecdw0rowdb3shiftdw?tenwddw10tempdxdw?tempaxdw?datasgends;*************************************codesgsegmentpara'code';-------------------------------------beginprocfar;mainpartofprogramassumecs:codesg,ds:datasg,ss:stacksg,es:datasg;setupstackforreturnpushdssubax,axpushax;setDSregistertocurrentdatasegmentmovax,datasgmovds,axmoves,ax;mainpartofprogramgoesheremovax,0600h;CALLDISPcallq10scrcallq20cursa20loop:callb10inptcmpacthlen,0je a30calld10hourcalle10ratecallf10multcallg10wagecallk10dispjmpa20loopa30:;calltimedatemov ax,0600hcallq10scrretbegin endp;-------------------------------------------Inputhours&rateb10inptprocnearleadx,messg1movah,09hint21hleadx,hrsparmovah,0ahint21hcmpacthlen,0jneb20retb20:movcol,25callq20cursleadx,messg2movah,09hint21hleadx,rateparmovah,0ahint21hretb10inptendp;--------------------------------------------Processhours:--------------d10hourproc nearmov nodec,0mov cl,acthlensubch,chleasi,hrsfld-1addsi,cxcallm10asbimov ax,binvalmov binhrs,axretd10hourendp;---------------------------------------------Processrate:-------------e10rateprocnearmovcl,actrlensubch,chleasi,ratefld-1addsi,cxcallm10asbimovax,binvalmovbinrate,axrete10rateendp;----------------------------------------------Multiply,round,&shift---------------------f10multprocnearmovcx,07leadi,ascwagemovax,3030hcldrepstoswmovshift,10movadjust,0movcx,nodeccmpcl,06jaf40deccxdeccxjlef30movnodec,02movax,01f20:multenwdloop f20mov shift,axshrax,1mov adjust,axf30:mov ax,binhrsmulbinrateaddax,adjustadcdx,0mov tempdx,dxmov tempax,ax;cmpadjust,0jz f50;mov ax,dxmov dx,0divshiftmov tempdx,axmov ax,tempaxdivshiftmov dx,tempdxmov tempax,axjmpf50;f40:movmov
ax,0dx,0f50:retf10multendp;-------------------------------------ConverttoASC-------------g10wage proc nearleasi,ascwage+11mov byteptr[si],'.'addsi,nodecg30:cmpbyteptr[si],'.'jneg35decsig35:cmpdx,0jnzg40cmpax,0010jb g50g40:mov ax,dxmov dx,0divtenwdmov tempdx,axmov ax,tempaxdivtenwdmov tempax,axor dl,30hmov [si],dldecsimov dx,tempdxjmp g30g50:or al,30hmov [si],alretg10wage endp;-----------------------------------------Displaywage-------------k10dispproc nearmov col,50callq20cursmov cx,10leasi,ascwagek20:cmpbyteptr[si],30hjnek30mov byteptr[si],20hincsiloop k20k30:leadx,messg3mov ah,09int 21hcmprow,20jaek80incrowjmpk90k80:mov ax,0601hcallq10scrmov col,0callq20cursk90:retk10dispendp;-----------------------------------------ConvertASCtobinary-----------------------m10asbiprocnearmovmult10,01movbinval,0movdecind,0subbx,bxm20:moval,[si]cmpal,'.'jnem40movdecind,01jmpm90m40:andax,000fhmulmult10jcoverflowaddbinval,axjc overflowmov ax,mult10multenwdmov mult10,axcmpdecind,0jnzm90incbxm90:decsiloop m20cmpdecind,0jz m100addnodec,bxjmpm100overflow:mov binval,0m100:retm10asbiendp;----------------------------------------------;Scrollscreen;--------------q10scr proc nearmov bh,07subcx,cxmov dx,184fhint 10hretq10scr endp;--------------------------------------------------Setcursor--------------q20cursproc nearmov ah,2subbh,bhmov dh,rowmov dl,colint 10hretq20cursendp;---------------------------------------------------codesgendsendbegin该部分的程序框图如下:实验截图如下:实验总结:在进行接受用户工作时间及工资率的时候必须先画好结构框图,避免出现前后不对应的情况,字的除法运算指令要求双精度的被除数和单精度的除数相处,结果应该是单精度的商。2.8HANOI塔题编写HANOI塔的程序,在这个谜题中,A轴自下而上的叠有大小逐渐见效的N的盘子,现在要求把它们都移到C轴上并保持原来的秩序。移动时允许把盘子暂时存放在B轴但必须遵循以下规则:1:一次只能有一个盘子从一个轴移动打另外一个轴2:一个盘子不能放在比他小的盘子上面。这是一个经典的递归子程序的例子。我们用N表示盘子数,并从小到大把盘子编号为1,2,3,。。。。。。N。用X,Y,Z,表示起始轴,宗建洲和最终轴。用UVI表示第个盘子从U轴移动到V轴,V可以是X,Y,Z,中的任意一个轴基数:HANOI(1,X,Y,Z)显示X1Z归纳步骤:HANOI(N,X,Y,Z)(N>1)做以下三步1执行HANOI(N-1,X,Z,Y)2显示XNZ3执行HANOI(N-1,X,Y,Z)根据这一算法可以分析出 HANOI的执行过程如图所示1模块名:main 为总控制块输入:接受从键盘输入的盘子数N及起始中间和最终轴名,存放在BX,CX,SI,DI,寄存器当中。输出:以UIV形式,顺序显示出盘子的移动办法功能:用递归计算并显示出 HANOI的移动办法基数:HANOI(1,X,Y,Z)显示XIZ归纳步骤:HANOI(N,X,Y,Z,)(N-1)(1)执行HANOI(N-1,X,,Z,Y)(2)显示XNZ(3)执行HANOI(N-1,Y,X,Z)调用子程序接受盘子数调用子程序实现回车,换行功能2模块名:decibin输入:键盘接受盘子数 N输出:把转换为二进制的 N值存入BX寄存器当中。功能:把从键盘接受的十进制装换为二进制数并存入 BX寄存器当中。3:模块名:HANOI输入:从BX寄存器中取得盘子数 N输出:显示盘子的移动办法功能:用递归算法计算并显示 HANOI的结果4模块名:CTRF功能:显示回车,换行5:模块名:save功能:保存NX,Y,Z,入站6:模块名:restore功能:恢复N,X,Y,Z7:模块名:PRINT功能:显示XNZ调用子程序BINIDEC把N值从二进制转换为十进制并在屏幕上显示出来调用子程序CRLF回车换行8:模块名:BINIDEC输入:从BX寄存器中取得N值输出:把N值以是十进制形式在屏幕上显示出来功能:把BX中的二进制N值转换为十进制形式,并在屏幕上显示出来。源程序如下:;**********************************************datareasegmentmessage1db'N=?',0ah,0dh,'$'message2db'WhatisthenameofspindleX?'db0ah,0dh,'$'message3db'WhatisthenameofspindleY?'db0ah,0dh,'$'message4db'WhatisthenameifspindleZ?'db0ah,0dh,'$'flagdw0constantdw10000,1000,100,10,1decibincrlfdatarea ends;**********************************************prognamsegment;----------------------------------------------main proc farassumecs:prognam,ds:datareastart:;setupstackforreturnpush dssubax,axpush ax;setDSregistertocurrentdatasegmentmovax,datareamovds,ax;mainpartofprogramgoeshereleadx,message1movah,09hint21hcallcall;cmpbx,0jz exit;leadx,message2movah,09hint 21hmovah,01hint 21hmovah,0movcx,axcall crlf;leadx,message3movah,09hint 21hmovah,01hint 21hmovah,0movsi,axcall crlf;leadx,message4movah,09hint 21hmov ah,01hint 21hmovah,0movdi,axcall crlf;callhanoi;exit:ret;returntoDOS;mainendp;----------------------------------------hanoiprocnear;definesubprocedure;SolvestowerofHANOIpuzzle;Argement:(BX)=N,(CX)=X,(SI)=Y,(DI)=Zcmpbx,1jebasiscallsavedecbxxchgsi,dicallhanoicallrestorcallprintdecbxxchgcx,sicallhanoijmpreturnb
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 深信服aES产品技术白皮书-V1.5
- 3.3汽化和液化 说课稿2025年初中人教版物理八年级上册
- 我奋斗我幸福心得体会
- 积极心理学理论下护理在细菌性阴道炎患者中的应用
- 《会计信息系统应用》课件 学习情境5 薪资管理系统应用
- 餐厨垃圾收运合作协议书
- 二零二五图书仓储与仓储物流信息化合同样本
- 二零二五年度办公大楼自来水供应与智能抄表服务合同
- 健康饮食规划实践指南
- 三农村资源利用优化方案设计
- 河南省驻马店市泌阳县部分中学联考2024-2025学年八年级下学期3月月考数学试题(原卷版+解析版)
- 肺结核病人的心理护理
- 2025年开封文化艺术职业学院单招职业技能测试题库含答案
- 2025年辽宁冶金职业技术学院单招职业适应性测试题库有完整答案
- 2025年安徽扬子职业技术学院单招职业适应性测试题库(各地真题)
- 创新创业项目计划书撰写
- 2024年上海市杨浦区复旦大学附中自主招生数学试卷
- 2025年安徽警官职业学院单招职业适应性测试题库带答案
- 《汽车底盘构造与维修》专业课程标准
- 2023年初中毕业生信息技术中考知识点详解
- 做账实操-建筑施工企业的收入确认方法
评论
0/150
提交评论