西南交通大学汇编实验报告_第1页
西南交通大学汇编实验报告_第2页
西南交通大学汇编实验报告_第3页
西南交通大学汇编实验报告_第4页
西南交通大学汇编实验报告_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

《汇编语言程序设计》实验报告院系 信息科学与技术学院专业 软件工程 年 级 2012级 学号 姓名 某某某 西南交通大学信息科学与技术学院

2014年6月目录实验一MASM6.11的使用方法 3实验目的 实验环境 实验步骤 实验结果及其分析 结论 实验二比较两个字符串的大小 15实验目的 2实验环境 实验步骤 4实验结果及其分析 结论 实验三求学生名次 24实验目的 实验环境 实验步骤 实验结果及其分析 结论 实验四子程序及堆栈 424.1求员工年工作量 424.1.1实验目的 实验环境 实验步骤 实验结果及其分析 1.5结论 4.2子程序和主程序之间的参数传递 524.2.1实验目的 4.2.2实验环境 4.2.3实验步骤 4.2.4实验结果及其分析 4.2.5结论 实验五汇编语言和C语言间的调用 59C语言和汇编语言混合编程下的排序算法 59实验目的 实验环境 实验步骤 实验结果及其分析 结论 汇编语言对C语言的调用求平均数 64实验目的 实验环境 实验步骤 实验结果及其分析 结论 实验一Masm6.ll的使用方法一、实验目的1、创建一个新的汇编语言程序,熟练掌握汇编语言开发工具的使用方法,并对开发环境中一些坏境变量进行设置。2、创建一个工程文件,对该工程文件进行编译,连接,并运行;3、对建立的工程文件进行调试,在运行过程中查看各个寄存器的值,内存单元的值等。二、实验环境该试验包括的硬件和软件条件如下:1、硬件环境IntelCoreDuoCPUP8700(2)内存4G2、软件环境WindowXPProfessorMASM6.11开发软件三、实验步骤1、将Masm6.11安装程序拷贝到D盘根目录下,并执行d:\Masm611目录下Setup.exe文件,按照安装提示将程序安装到C盘根目录。双击setup,exe后按所给提示进行安装(基本上都是回车,中间不需要做什么更改),安装完成后将BIN和HELP文件夹里面的文件拷贝到BINR文件夹里,安装工作完成之后打开PWB.exe集成开发环境应用程序2、将C:\masm611\Bin目录下的所有文件拷贝到C:\Masm611\binr目录下,将C:\Masm61l\help目录下的所有文件拷贝到c:\Masm61\binr目录下3、执行C:\Masm611\Binr目录下的pwb.exe文件,打开开发环境。4、在PWB编辑窗口中输入实验1.1中的程序,并保存为test,asm文件如图1.1。

DOSBox0.74,Cpuspeed:3000cycles,Frameskip0,Program:PWBFileEditSearchProjectRimOptionsBrowseUindowHelp=[U G:\BIM\SHIYAMYI.ASM |i|tNumdbO QEnMsgdb0ah,Odh/$'MsgZdb"pleaseinputthegradeofeachstudent:$'*Msg3db"theaueragegradeofthesestudentis:$°augdb0ascavgdb0,0/$,DataendsStacksegmentparastackdbZOhdup(e)图LI5、执行Project菜单下NewProject子菜单创建一个新的工程文件,并命名为test,mak,将test.asm文件加入到该工程文件中如图1.2。潮DOSBox0.74,Cpuspeed:3000cycles.Frameskip0,Program:PWBFileEditSearchProjectRunOptionsBrowseWindowHelp=[1!NuEnMsMsauasData EditProjectileName:[SHIYAMTH.STS Filelist:GABINSHIYAMOM.STSSHIYANSA.ASMSHIYANSA.BAKSHIYAMSA.EXESHIYAMSA.OBJSHIYAMW.MAKSHIYAMSI.ASISHIYAMSI.0BJSHIYAMYI.ASMSHIYAMITi.EXESHIYANYI.OBJStackdbStack"界卷黑糕金燃赛爰然段漆建泰然域置熟海黑然城锦熊标援然崔段挑段郎■短逑段黑段慧rejectFileEditSearchProjectRunOptionsBrowseWindowHelp=[1!NuEnMsMsauasData EditProjectileName:[SHIYAMTH.STS Filelist:GABINSHIYAMOM.STSSHIYANSA.ASMSHIYANSA.BAKSHIYAMSA.EXESHIYAMSA.OBJSHIYAMW.MAKSHIYAMSI.ASISHIYAMSI.0BJSHIYAMYI.ASMSHIYAMITi.EXESHIYANYI.OBJStackdbStack"界卷黑糕金燃赛爰然段漆建泰然域置熟海黑然城锦熊标援然崔段挑段郎■短逑段黑段慧reject:G:\BIN\123.makcodeSHIYAM1B.STSStart:「:.・;•••:;一」Fl=HelpDives/Dirs:<aveList><Cance1><elp>06.04:IYANIN.STS[-A-][-G-][-Z-1dd/DeleteoTopofList>learListAdAll[X]StIncludeDependencies[X]gnoreSystemIncludeFilesinterEsc=CancelTaixtField1.26、执行Project下Build子菜单编译连接该工程文件,并运行该可执行程序,观察程序执行的结果如图L3。

o 区o 区隔DOSBox0.74,Cpuspeed:3000cycles.Frameskip0,Program:PWB图1.3在Project菜单中点击Rebuildall选项,如果没有错误,如图1.4所示,再点击RunPogram,进入运行界面运行程序得到运行结果pleaseinputthenumberofstudent:5pleaseinputthegradeofeachstudent:9896B8B6B8theaveragegradeofthesestudentis:91Strike&keyuihenready,,・图1.47、执行Run菜单下Debug子菜单,进入调试环境。

Debugprogram进入调试界面,在调式界面中的windows选项中点击Register和Memory1会弹出两个窗口,如图所示。通过7窗口可以看到在程序执行之前寄存器AX,BX,CX,DX,BP,SI,DI,IP的初始值都是0,堆栈指针SP=0020H,并且通过图中的3窗口可以查看反编译后的代码。如图1.5图1.58、在程序的如下位置设置断点,并按要求观察寄存器堆栈或者内存单元的值。codesegmentAssumeCs:code,Ss:stack,ds:DataStart:movax,datamovds,axleadx,Msgl ;此行设置断点,观察DS所指示的数据段的情况movah,09hint21hCallNumproc ;此行设置断点,观察屏幕输出,并观察堆栈的变化movnum,bl ;此行设置断点,观察bl的值,并观察堆栈的变化leadx,EnMsgmovah,09hint21hleadx,Msg2movah,09hint21hcallAvgproc;此行设置断点,观察屏幕输出信息leadx,EnMsg;此行设置断点,观察avg所对应的存储单元的值movah,09hint21hleadx,Msg3movah,09hint21hcallbta ;此行设置断点,观察屏幕输出信息movah,4ch ;此行设置断点,观察ascavg所对应的存储单元的值及屏;幕输出信息int21hNumprocprocpushaxpushexpushdxleadx,EnMsgmovah,09hint21hmovbl,0lopl:movah,Olhint21h ;设置断点观察al寄存器的值empal,Odhjzlop2empal,'O'jlloplempal,’9'jaloplsubal,30hmovcl,almoval,blmovch,10mulchmovbl,al ;设置断点观察al寄存器的值addbl,cl ;设置断点观察bl寄存器的值jmplopllop2:popdxpopexpopax

retNumprocendpAvgprocprocpushaxpushexxordx,dxmovcl,numlop3:callNumprocxorax,axmoval,bladdax,dxDivnumaddavg,alxordx,dx;设置断点观察堆栈值的变化;设置断点观察cl寄存器的值;设置断点观察avg存储单元的值movdl,ahsubcl,1jnzlop3popaxpopexretAvgprocendpbtaprocpushaxpushbxxorax,axmoval,avgmovbl,10divbladdah,30haddal,30hmovascavg,almovascavg+1,ahleadx,EnMsgmovah,09hint21hleadx,ascavgmovah,09hint21h;设置断点观察avg存储单元的值;设置断点观察堆栈值的变化;设置断点观察堆栈值的变化;设置断点观察ax寄存器的值;设置断点观察ascavg存储单元的值;设置断点观察dx寄存器的值popbxpopaxretbtaendpcodeendsendstart9、按照程序的执行过程绘制出程序流程图。主函数流程图,如图1.7所示开始显示输入提示信息msgl调用Numproc输入学生总数:Num,并将Num由真值转换成对应的ASCH显不输入提不信息msg2

I调用Avgproc,输入每个学生的成绩,并将平均成绩送给avg调用bta,把avg的由ASCII转换真值,并显示结束图1.7函数Numproc的流程图如图1.8Avgproc的流程图如图1,9所示入口pushax;pushex;push函数Numproc的流程图如图1.8Avgproc的流程图如图1,9所示入口pushax;pushex;pushax;pushex;显示回车换行将num的值送给cl返回调用Numproc输入各个返回图1.9图1.8四、实验结果及其分析leadx.Msgl此行设置断点,观察DS所指示的数据段的情况。截图:■=Lb」 =memorylb075|:O000706C6561736520696E707574Z074pleaseinputt0?5B:O00E6865Z06E756D62657ZZ06F66Z073henumberofsO75B:0O1C747564656E743A2400QAOD24706Ctudent:$.gr$p1075B:OOZA6561闹652。696E7。7574746865easeinputthe图1.10(如图1.10)数据段里面显示了"pleaseinputthenumberofstudent”。CallNumproc ;此行设置断点,观察屏幕输出,并观察堆栈的变化截图:堆栈1=[5] memory]b0x0763:0x0000 J0763:0000 00 00 00 00 00000000000000 0000 0763:00OD 0O 00 00 00 0O0000020Z5B09 5B07 QD[o[«O763:O01A 0E 00 65 07 0Z0ZB85B078ED8 CC16 n.e.»[.A+|}_图i.ii如图(i.u)可以看到堆栈里显示了“……截图:屏幕输出leaseinputthenumberofstudent:图1.12图(1.12)可以看到程序输出了DS数据段里面的东西。我们输入“5addbl,cl;设置断点观察bl寄存器的值截图:blSc-x-K-rl图1.13可见我们刚刚输入的”5",已经保存到了BX的低8位上了。callAvgproc ;此行设置断点,观察屏幕输出信息截图:屏幕输出pleaseinputthegradeofeachstudent:图1.14依次位五个学生输入成绩为:98,88,96,86,88leadx,EnMsg ;此行设置断点,观察avg所对应的存储单元的值截图:AX里面的数据AX=图1.15图(1.15)中可以看到Avg里面的数据我们可以看到为0.callbta ;此行设置断点,观察屏幕输出信息Ipleaseinputthenumberofstudent:Ipleaseinputthegradeofeachstudent:B8图1.16要求一个字符一个字符的输入:最后我们的输入为(如图L17):pleaseinputthenumberofstudent:5pleaseinputthegradeofeachstudent:9896B8B6B8图1.17movah,4ch ;此行设置断点,观察ascavg所对应的存储单元的值及屏;幕输出信息截图:ascavg、

图1.18学生成绩输入完成后AX里面变成了005A(转化成十进制即为平均成绩91),在执行bta后将其转化为真值后输出。五、结论通过这次实验,我学会了如何使用MASM6.il去编写,调试和运行一个汇编语言程序,但是对于有些操作还是不是很熟悉,还要在今后的后继实验中更进一步的去熟悉MASM6.11的使用方法。其次是对汇编语言的很多指令很陌生,不知道是什么意思,在今后的实验中我也要更进一步的去熟悉我们要学处理器的汇编语言的指令系统,并进一步学习汇编语言的语法。实验二比较两个字符串的大小一、实验目的本次实验主要达到如下目的:1、进一步熟悉MSAM6.11软件的使用方法。2、从键盘输入两个字符串,比较两个字符串的大小。二、实验环境该试验包括的硬件和软件条件如下:1、硬件环境(1)IntelCoreDuoCPUP8700(2)内存4G2、软件环境WindowXPProfessorMASM6.11开发软件三、实验步骤1、画出实现上述功能的汇编语言程序流程图。2、写出实现上述功能的汇编语言程序。3、编译、连接编写的汇编语言程序,并运行生成的可执行文件,描述其执行情况。4、对上述程序进行调试,比较反汇编后的程序和源程序的区别。5、描述反编译后的程序在执行之前数据段的内容以及调试过程中各寄存器的变化情况和执行结束后数据段的内容。四、实验结果及其分析1,结果判定方法:如果第一个字符串比第二个字符串大,则显示1;如果两个字符串相等,则显示0;如果第一个字符串比第二个字符串小,则显示T.

2,流程图:1、实验流程图如图所示:开始根据提示内容分别输入两个字符串显示msg3的内容分别将string1和图2.1图2.23,源代码:datasegmentmsgldb“Pleaseinputthefirststring:$/zstringldb100,0,100dup(?)msg2dbOah,Odh,"Pleaseinputthesecondstring:$,zstring2db100,0,100dup(?)msg3dbOah,Odh,"Thereasultis:$”resultldbresult2db"T$"resultsdb"0$〃dataendsstacksegmentparastackdb20Hdup(O)stackendscodesegmentassumecs:code,ss:stack,ds:datastart: movax,datamov ds,axlea dx,msglmov ah,09hTOC\o"1-5"\h\zint 21hlea dx,stringlmov ah,Oahint 21hlea dx,msg2movah,09hint 21hleadx,string2movah,Oahint21hleadx,msg3movah,09hint21hLEASI,stringl+2LEADI,string2+2xorbx,bxmovbl,stringl+1xorex,exmovcl,string2+lempbx,ex

jaupjzupmovex,bxup:moval,[SI]movbl,[DI]cmpal,bljanextljbnext2INCSIINCDIloopupxorbx,bxmovbl,stringl+1xorex,exmovcl,string2+lcmpbx,exjanextljbnext2jmpnext3nextl:leadx,resultljmpexitnext2:leadx,result2jmpexitnext3:leadx,resultsexit:movah,09hint21hmovah,4chint21hcodeendsendstart4,运行程序:图2.35,运行结果:6,程序分析和调试(1),首先进入debug调试坏境,并设置好断点ffliDOSBox0.74,Cpuspeed:max100%cycles,Frameskip0,Program:CV |cdI回IS3|FileEditSearchRunDataOptionsCallsWindowsHelp r-[3] source1CS:IP [0770:0000B85B07 M0U AX,O75B0770:00038ED8 M0U DS,AX0770:00058D1600O0 LEA DX,U0RD PTR[0000]0770:0009B409 MOU AH,090?70:0O0BCDZ1 IMT Z1AX=00OOBX=0O0OCX=0000DX=0O0GSP=0?70:00OD8D161FO0 LEA DX.UORDPTR[0O1F]0770:0011B40A HOU AH,0A0770:0013CDZ1 IMT Z1BP=0000SI=0000DI=00000770:00158D168500 LEA DX.UORDPTR[0065]0770:0019B409 MOU AH,©90770:001BCD21 IMT 21DS=TES二)ss=ii1i rCZ*1 1lxnc• 1id-I-L«JJ IIKJIIIU1yXU ・D:960ZB4=f.fti版可111 —074B:000OCD20FF9F00EAFFFFADDI1FL=074B:O0OD059703B405DDOBB40530070506如叫用词收)♦一O74B:O01A07000605FFFFFFFFFFFFFFFFFFkuup3]1卜ZNAPO1PLic—19] command CU1053Warning:TOOLS.IMInotfoundCUO101Warning:noCodeUiewinformationfor'G:\BIN\SHYANTWO.exe’<F8=Trace><F10=Step><F5=Go><F3=S1Fmt><Sh+F3=MlFmt> DEC图2.52,我们按F5执行到断点,逐步调试。(a)在调式界面中的windows选项中点击Register和Memory1查看当前寄存器的值,可以看到在程序执行之前寄存器AX,BX,CX,DX,BP,SI,DI的初始值都是0,堆栈指针SP=0020H,数据段DS和附加段CS的初始值都是209CH,堆栈段SS=20BFH,代码段CS=2OC1H。

用DOSBox0.74,Cpuspeed:max100%cycles,Frameskip0,Program:CVFileEditSearchRunData用DOSBox0.74,Cpuspeed:max100%cycles,Frameskip0,Program:CVFileEditSearchRunDataOptionsCalIsUindousHelp-[3] ——source1CS:IP-—0770:0000B85B0?MDUAX,075B0770:00038ED8MDUDS,AX0770:00058D160000LEADX.UORDPTR[0000]0770:0009B409MDUAH,090770:000BCDZ1INTZ107?0:0O0D8D161F00LEADX,WORDPTR[001F]0770:0011B40AMDUMOA0770:0013CDZ1IMTZ10770:00158D16850OLEADX,WORDPTR[006510770:0019B409MDUAH,09077O:001BCDZ1IMTZ1—[5J memory!bDS:O 074B:0O00 CD ZO FF 9F GO EA FF FF AD DE 96 GZ B4 =f.ft* 版叫074B:O00D 05 97 03 B4 06 DD OB B4 05 30 07 05 06 如川用第0?4B:0O1A 0? 0O 06 G5 FF FF FF FF FF FF FF FF FF ・.X1UUP3]PL1ZMAPOMC图2.6(b)在leadx,msgl行设置断点可以看到DS数据段里面的数据—L5] memory 1 bOx075B:6x0OOO 075B:000O 50 6C 65 61 73 65 ZO 69 6E 70 75 74 ZO Please inputO75B:O00D 74 68 65 ZO 66 69 7Z 73 74 ZO 73 74 7Z thefirst str075B:O01A 69 6E 67 3A Z4 64 00 00 00 00 00 00 GO ing:$d 图2.7DS里面显示"pleaseinputthefirststring”(c)在movah,Oahint 21h出设置断点可以看到屏幕输出(c)Pleaseinputthefirststring:图2.8我们输入:xuyusongo(d)LEASI,stringl+2LEADI,string2+2设置断点;LEALEASI,WORDPTR[0OZHDI,WORDPTR[0QA9]?70LEALEASI,WORDPTR[0OZHDI,WORDPTR[0QA9]770:00318D3EA900图2.9功能即是将我们输入的两个字符串的首地址送给SI和DI我们可以看到SI=0021H,DI=00A9HE cmpbx,ex出设置断点;XUK0770:00378A1EZ000MDUBL,BYTEPTR[OOZO]0770:003B33C9XDRcx,cx0770:OO3D8AOEA80OMDUCL,B\TEPTR[0QA8]0770:00413BD9CMP|BX,CX图2.11断点之前的语句是分别将代码的长度送给BX,CX完成这些语句后■=[?]reg=1TAX=035BQBX=0009CX=gggi]I可以看到BX=0009H,CX==0008H(f)在loopup处设置断点:?70:OGHD38D8CMPAL,BL770:004F771AJAOO6B770:00517Z1EJB0071770:005346IMCSI770:005447INCDI770:0055E2FZLOOPOO49图2.13在loopup之前的语句是先把两字符串的内容先送给AL和BL,在比较AL和BL的大小,若AL>BL则跳至201C:0069H对应的代码段,若AL<BL,则跳至201C:006F对应的代码段,若AL=BL,则SI=SI+1,DI=DI+1,CX=CX-1,跳至0047,循环比较两个字符中的第二个字符,直至CX=O,由于第一个字符相等DI和SI均要加1得到如图图2.14图2.14SI由原来的0021H变成了现在的0022HDI由原来的00A9H变成了现在的OOAAH(g)在movah,09hint21h处设置断点;I?70:007BB409 MDU AH,09l770:00?DCDZ1 INT Z|图2.15此段语句是调用显示中断,显示比较后的结果。在内存窗口中输入075B:0124(即为DS数据段里DX的数据)后可以查看到结果为0。表示第一个字符串比第二个字符串相等。■=[5] memory1b0X075B:0x01Z4 .075B:O1Z430Z400000O0OO0O000000000026五、结论通过这次实验,我学会了如何使用MASM6.il去编写,调试和运行一个汇编语言程序,但是对于有些操作还是不是很熟悉,还要在今后的后继实验中更进一步的去熟悉MASM6.11的使用方法。学习到了很多汇编语言的语句比如lea,cmp,xor,cldJZ ;为0则跳转,JNZ;不为0则跳转JS ;为负则跳转,JNS ;不为负则跳转JC ;进位则跳转,JNC ;不进位则跳转J0 ;溢出则跳转,JNO ;不溢出则跳转JA ;无符号大于则跳转,JNA;无符号不大于则跳转还学会了函数的调用,循坏的运用实验三求学生名次一、实验目的本次实验主要达到如下目的:从键盘输入若干个学生(总数不超过500)的姓名(英文字母不超过8个)及其5门课程的总成绩(百分制),输出任意名次的学生的姓名及其5门课程的总成绩(按总成绩的高低排序,总成绩最高者为第一名)二、实验环境该试验包括的硬件和软件条件如下:1、硬件环境(1)IntelCoreDuoCPUP8700(2)内存4G2、软件环境WindowXPProfessorMASM6.11开发软件三、实验步骤1、画出满足上述要求的程序流程图2、写出源程序及程序段说明四、实验结果及其分析1.源程序及程序段说明程序段的的说明用黑体标示datasegmentstudentstrucstunamedb21,0,21dup(0)stugradedw0studentendsstustudent500dup({})adb500dup(?)numdw0rankingdw0msgldb"Pleaseinputthenumberofstudentsmsg2db"Pleaseinputtheinformationofeachstudent:",Oah,Odh,'$'msg3db"Result:$〃msg4dbOah,Odh,'$'msg5db〃name:$〃msg6dbOah,Odh,"grade:$〃msg7db"Pleaseinputtherankofastudent(input0exit):$〃msg8db"TheReault:Oah,Odh,'$'indatadb5,0,5dup(O)stuGradedb5,0,5dup(0)maxdw0dataendsstacksegmentparastackdb40hdup(O)stackendscodesegmentassumecs:code,ss:stack,es:data,ds:datastart:movmovax,datads,axleadx,msgl ;提示输入学生总数movah,09hint21hcallinput ;调用input函数输入学生总数并将总数存放在寄存器ax里movnum,axleadx,msg2;提示输入学生信息movah,09hint21hcallstuinf;调用stuinf函数输入学生信息callstusort;调用排序函数对学生按成绩高低进行排序leadx,msg8movah,09hint21hcallprint;调用打印函数显示排好序的所有学生up: leadx,msg7;提示输入学生名次movah,09hint21hcallinput;调用input函数输入学生名次并将输入的值保存在ax寄存器里面empax,0;ax>0?若不是,则跳至exit,结束程序jnaexitempax,num;ax<num?若不是,也跳至exit,结束程序jaexitsubax,1movranking,ax;将ax-1的值赋给rankingcallprint1;调用printl函数打印第n名的学生jmpup;跳至up循环exit:movah,4chint21hinputproc;从键盘上接收一串字符串;从键盘上接收一串字符串lop:subindata[si],30hxorbx,bxmovbl,indata[si]addax,bxincsisubex,1jzexitlmovbx,10mulbxjmplop;lop这一段时将从键盘上接收的indata字符串逐位转换为二进制机器码并累加到ax里面后ax=ax*10exitl:pushaxleadx,msg4 ;显示一个回车换行movah,09hint21hpopaxpopsipopbxpopdxpopexretinputendp;学生信息输入函数;学生信息输入函数pushaxpushbxpushexpushdxpushsipushdixorex,exmovsi,0lopl:leaintlopl:leaintdx,msg5ah,09h21h;提示输入学生姓名ax,axax,sia[si],ax,axax,sia[si],al;将si赋给a[si]xor bx,bxmov bl,25mov ax,simul blxor di,dimov di,ax;将si*25后赋给di,25为结构体数组的长度leadx,stu[di].stunamemovah,Oahint21h;int21h;输入学生姓名xorax,axmoval,stu[di].stuname+1incalxorbx,bxleabx,stu[di].stuname+2addbx,axsubbx,dimovstu[di].stuname[bx],‘$';在输入的姓名后面加一个结束符'$'leadx,msg6movah,09hint21hcallinput;提示输入学生成绩int21hcallinput;调用input函数输入学生成绩movstu[di].stugrade,axmesisubex,1jnzlopl;cx-l=0?,若不是则跳回lopl循环输入下一个学生信息popdipopsipopdxpopexpopbxpopaxretstuinfendpstusortproc ;排序函数pushaxpushbxpushexpushdxpushsipushdixorex,exmovcx,0 ;ex起始值为0,控制第一层循环lop3:xorsi,simovsi,exxorax,axmoval,a[si]xorbx,bxmovbl,25mulblmovsi,ax ;这一段时将a[cx]*25赋给simovmax,ex;max保存每一次循环中成绩最高的学生在序号数组里面对应的元素下标,初始值为CXxordx,dxmovdx,exincdx ;将ex赋给dx后dx+1,dx控制第二层循环xordi,dimovdi,dxxorax,axmoval,a[di]mulblxordi,dimovdi,ax ;这一段时将a[cxT]*25的值赋给dilop4:pushsixorsi,simovsi,maxxorax,axmoval,a[si]mulblmovsi,ax ;a[max]*25的值赋给sixorax,axmovax,stu[si].stugradexorsi,sipopsiempax,stu[di].stugradejnbnext1

movmax,dx;stu[a[max]*25].stugrade>stu[di].stugrade?,是则跳至next1继续,不是则将dx的值赋给maxnextl:incdxmovdi,dxxorax,axmoval,a[di]mulblmovdi,axcmpdx,numjblop4;dx+Knum?,是则跳至lop4循环,否则执行下一条语句cmpex,maxjznext2;cx=max?,不是执行以下的交换代码,不是则跳至next2继续pushsixorsi,simovsi,exmovdi,maxxorax,axmoval,a[si]xchgal,a[di]mova[si],alxorsi,sipopsi ;这一段时交换a[ex]与a[max]的值next2: incexxorax,axmovax,numsubax,1cmpex,axjblop3 ;cx〈numT?,是则跳至lop3循环,否则返回调用点popdipopsipopdxpopexpopbxpopaxretstusortendpprintproc;所有学生信息打印函数pushaxpushbxpushexpushdxpushsipushdixorex,exmovex,nummovsi,0lop2:leadx,msg5movah,09hint21h ;提示输出学生姓名moval,a[si]xorbx,bxmovbl,25mulblmovdi,axleadx,stu[di].stuname+2movah,09hint21h ;输出学生姓名leadx,msg6movah,09hint21h ;提示输出学生成绩callbta ;调用bta函数输出学生成绩incsisubex,1jnzlop2 ;cxT=0?,不是则跳至lop2循环,是则返回调用点popdiPOPsi

popexpopbxpopaxretprintendpprintlproc;单个学生信息输出函数pushaxpushbxpushexpushdxpushsipushdixorex,exmovex,rankingmovsi,exmoval,a[si]xorbx,bxmovbl,25mulblmovdi,axleadx,msg5movah,09hint21h;提示输出学生姓名leadx,stu[di].stuname+2movah,09hint21h;输出学生姓名leadx,msg6movah,09hint21h;提示输出学生成绩callbta;调用bta函数输出学生成绩POPdipopdxpopexpopbxpopaxretprintlendpbtaprocpushaxpushbxpushdxpushsimovsi,2xorax,axmovax,stu[di],stugradelop5:movbl,10divbladdah,30hmovindata[si],ah;将学生成绩送给ax后除10,并将余数放入indata[si]里面empal,0jznext4;al=0?,即除后的商是否为0,若为0则跳至next4执行,否执行下一条语句incsixorah,ahjmplop5next4:pushdixordi,dimovdi,2lop6:movbl,indata[si]movstuGrade[di],bldecsiincdi

cmpsi,1jznext5jmplop6 ;将字符串数组indata的内容倒序送入stuGrade内next5:movstuGrade[di],'$';在字符串的末尾加结束符'$'xordi,dipopdileadx,stuGrade+2movah,09hint21h;显示字符串stuGradeleadx,msg4movah,09hint21h;显示回车换行popsipopdxpopbxpopaxretbtaendpcodeendsendstart(2).input函数流程图如图(2).input函数流程图如图从键盘上接收字符串保存在indata里面2,流程图:(1),专函数流程以如图芋提示输入学生总数并调用input函数进行输入Cl=indata+l:si=2:调用stusort函数对学生进行排序调用stusort函数对学生进行排序提示输入学生信息并调用stuinf函数进行输入调用print函数打印排序好了的学生信息入口入口CX=num提示并输入学生图3.3cx=()入口cx=num;si=O入口cx=num;si=O入口di=a[rankingj*25输出name:I输出stu[di].stunameI输出grade:I调用bta函数输出学生成绩 ,、返回图3.6图3.5入口si=2;ax=stu[di].stugradbl=10;ax/bl输出字符串stuGrade

输出回车换行返回3,运行图3.8圈DOSBox0.74,Cpuspeed:3000cycles,Frameskip0,Program:SHIYANTH |o|回iS3|grade:88name:yanghaipenggrade:78name:guoxiaojinggrade:90Reau1:name:guoxiaojinggrade:90name:youchaocaigrade:88name:caoyugrade:78name:yanghaipenggrade:78name:zhoubinggrade:66name:xuyusonggrade:60Pleaseinputtherankingofastudent(input0exit):3name:caoyugrade:78Pleaseinputtherankingofastudent(input0exit):4name:yanghaipenggrade:?8Pleaseinputtherankingofastudent(input0exit):图3.9五、结论通过这个实验,了解了如何定义和运用结构体,学会更多的汇编指令。了解到一些关于汇编的数据存储知识。其次是程序调试中遇到了诸多问题,问老师以及同学得到解决,学习到了汇编语言要常问老师同学在运行过程中,有一点还做的不足。如果有两个同学的成绩是相同的那么他们两的名次就是按我输入的先后次序来排名的,也就是说不能解决排名并列问题,我希望在今后的实验中能学习到更多的汇编编程方法,以实现更多更好的编程思想和编程的技巧。实验四子程序及堆栈4.1求员工年工作量一、实验目的本次实验主要达到如下目的:某单位在计算工作量时采用工作量=工作时间(小时)*系数,计算员工的工作量。其中工种不同其系数也不一样,该单位有很多不同的工种(不大于100)。请从键盘上输入每一位工人一年的工作时间(按小时计算,精确到小数点后一位)以及该工人的工种所对应的系数(精确到小数点后两位),球该单位所有员工(不超过1000人)一年的工作量。二、实验环境该试验包括的硬件和软件条件如下:1、硬件环境(1)IntelCoreDuoCPUP8700(2)内存4G2、软件环境(1)WindowXPProfessor(2)MASM6.11开发软件三、实验步骤1、对上述问题进行分析,写出分析报告及相关算法;2、写出各个模块的说明;3、画出各个模块的流程图;4、画出各个模块之间的调用关系;5、编写程序实现上述要求。6、写出满足上述要求的实验报告。四、实验结果及其分析1、分析实验要求并写出分析报告计算法:本程序由三个部分组成:输入部分(包含输入员工数量,输入每位员工的年工作时间和输入每位员工的工种对应的系数);计算该公司所有员工的年总工作量;显示该公司所有员工的年总工作量。在输入部分,须将十进制数ASCH码转换成二进制数。因为年工作时间和工种可能存在小数,而工作时间的小数一般只有一位,工种系数的小数一般只有两位,所以为了方便计算,将每一位员工的工作时间都乘以10将每一个员工对应的工种都乘以100,从而去掉小数,做成整数运算。而这种算法是从键盘上一位一位的输入,当遇到小数点就直接去掉小数点,接收下一位数。所以在输入时要注意的是输入的工作时间必须包含一位小数(如351.0),输入的工种系数必须包含两位小数(如65.00)。在计算年总工作量,因为所有员工的年总工作量有可能会超过65535,因此需要采用32位寄存器,从而简化运算的复杂性。在输出年总工作量部分,因为所有员工的工作时间都乘了10,工种系数都乘了100,所以计算出来的年总工作量是实际年总工作量的1000倍,所以应该把小数点放在倒数第3个位置,同时输出小数点后三位。2、该程序的主要模块及其说明如下:.主程序模块主程序主要实现各模块之间的联系,显示提示信息。.输入及转换模块:input输入:从键盘上输,可输入整数,也可输入小数输出:将输出结果保存在DX寄存器中功能:一位一位的从键盘上接收,将非小数点的每一位数转换为相应其对应的BCD码,并将DX*10后加入DX中。所以当输入的数中含有一位小数是就默认乘了10,含有两位小数就默认乘了100„.计算模块:ctotal输入:从DX寄存器中获取输出:输出结果保存在total存储单元中功能:循环调用input子程序输入工作时间和工种系数,两次调用输入完成后将二者相乘后加入total存储单元中。调用次数为员工的人数。.输出模块:output输入:total存储单元输出:tot开始的内存单元,并显示在计算机屏幕上。功能:将total存储单元的内容转换成十进制数ASCH码形式,并在输出结果的倒数第3位前插入小数点,然后存储在tot开始的存储单元,最后一位一位将结果输出。在输出前将整数前面的0去掉。3、程序流程框图:主程序开始ctotal开始提示输入信息,Num一输入员工个数调用ctotal输入每个员工的工作时间和工种系数,并计算公司年总工作调用output转换并显示该公司的年总工作量结束图4.1主程序流程图图4.2ctotal函数流程图input开始Si<-tot的最后一位数的偏移地址4、各个模块之间的调用关系如图4.5所示:图4.5实验模块层次图5、实验源代码:.modelsmall.386pdatasegmentmsgldb"Pleaseinputnumberofmembers:$z,msg2 dbOah,Odh,'Pleaseinputworktimeofamember:msg3 dbOah,Odh,"Pleaseinputthetypeofworkofamember:$z,msg4 db Oah,Odh, z,Thetotalgongzuoliangofallmembersis:$”TOC\o"1-5"\h\zmsg5 db Oah,Odh,' $'num dw 0time dw 0total dd 0totdb16dup(O)dataendsstacksegmentparastackdb20hdup(O)stackendscodesegmentassumecs:code,ss:stack,ds:datastart:movax,datamovds,axleadx,msglmovah,09hint21hcallinputmovnum,dxcallctotalleadx,msg4movah,09hint21hcalloutputmovah,4chint21hinputprocpushaxpushbxpushexxordx,dxlopl:movah,Olhint21hempal,Odhjzextplempal,','jzloplandal,Ofhmovcl,almovax,dxmovbx,10mulbxmovdx,axmovch,0adddx,exnext:jmploplextpl:popexpopbxpopaxretinputendpctotalprocpusheaxpushexpushdxxorex,exmovex,numlop2:leadx,msg2movah,09hint21hcallinputxorbx,bxmovbx,dxleadx,msg3movah,09hint21hcallinputxoreax,eaxmoveax,ebxxorebx,ebxmovbx,dxmulebxaddtotal,eaxlooplop2popdxpopexpopeaxretctotalendpoutputprocpushsi

pushebxpusheaxpushexxorex,exleasi,totaddsi,16moveax,totalmovebx,10lop3:xoredx,edxdivebxmov[si],dlincexempex,3jnznext2decsipushaxmoval//mov[si],alpopaxnext2:empeax,0jznext3decsijmplop3next3:leasi,totmovex,17lop4:moval,[si]incsidecexempal,0jzlop4decsiincexlop5:moval,[si]empal,'・'

jznext4oral,30hnext4:movdl,almovah,02hint21hincsilooplop5popexpopeaxpopebxpopsiretoutputendpcodeendsendstart6、程序执行情况如图4.6所示,输入了三个员工的工作时间和工种系数,计算出一年的工作量为:1281800.293圈DOSBox0.74,Cpuspeed:3000cycles.Frameskip0,Program:PWBZ:\>mountgd:\masm611DriveGismountedaslocaldirectoryd:\masm611X、>g:G:\>cdbinrn)etotalgongzuoliangofallmembersis:1Z81800.Z93fleaseinputnumberofmembers:3Measeinputworktimeofamember:8Z00.5leaseinputthetypeofworkofamember:Z8.1ZPleaseinputworktimeofamember:5000Fleaseinputfleaseinputnumberofmembers:3Measeinputworktimeofamember:8Z00.5leaseinputthetypeofworkofamember:Z8.1ZPleaseinputworktimeofamember:5000Fleaseinputthetypeofuiorkofamember:1Z.98Pleaseinputworktimeofamember:6504.3Pleaseinputthetypeofuorkofamember:23.87图4.6程序执行情况五、结论这个实验主要是熟悉子程序的实现,虽然在前几个实验也用过子程序,但那是都没有怎么去深究它的原理,通过这个实验我进一步熟悉了子程序的定义方法和调用方法。并且通过此实验我学会了怎么对小数进行运算。实验4.2子程序与主程序之间的参数传递一、实验目的本次实验主要达到如下目的:通过定义公共变量的方法实现主程序和子程序之间的参数传递。如在主程序和子程序中都定义一个具有Common和Public属性的数据段,然后将需要传递的参数放在这个段中,这样在主程序和子程序中都可以使用这个段所定义的变量To二、实验环境该试验包括的硬件和软件条件如下:1、硬件环境(1)IntelCoreDuoCPUP8700(2)内存4G2、软件环境WindowXPProfessorMASM6.11开发软件三、实验步骤1、设计一个子程序模块,将带传递的变量k所在的数据段属性设置成Common,并实现十进制ASCH码到二进制数的转换,将转换结果存放在变量k中。2、设计一个子程序模块,将带传递的变量m所在的数据段属性设置成Public并实现十进制ASCH码到二进制数的转换,将转换结果存放在变量m中。3、比较上述两种属性下数据段的区别。4、设计一个主程序模块,通过子程序调用的方式,将(1)和(2)执行后存放在k和m中的变量值取出来存放在该主程序定义的变量i和j中。5、对上述程序进行调试,写出调试过程中内存单元和寄存器的变化,并解释为什么?6、根据上述要求,写出实验报告。四、实验结果及其分析1.、设计一个子程序模块,将带传递的变量k所在的数据段属性设置成Common,并实现十进制ASCH码到二进制数的转换,将转换结果存放在变量k中。其源代码如下:extrnexit:farpublicinputdatalsegmentcommonkdw?datalendsstacksegmentparastackdb20hdup(O)stackendscodesegmentassumecs:code,ss:stack,ds:datalinput:pushdsmovax,datalmovds,axxordx,dxlop:movah,Olhint21hcmpal,Odhjznextxorbx,bxandal,Ofhmovbl,almovax,dxmovex,10mulexaddax,bxmovdx,axjmplopnext:movk,dxpopdsjmpexitcodeendsend2、设计一个子程序模块,将带传递的变量m所在的数据段属性设置成Public并实现十进制ASCII码到二进制数的转换,将转换结果存放在变量m中。publicmdata2segmentpublicmdw?data2endsstacksegmentparastackdb20hdup(O)stackendscodesegmentassumecs:code,ss:stack,ds:data2atoiprocfarpushdsmovax,data2movds,axlop:movah,Olhint21hempal,Odhjznextxorbx,bxandal,Ofhmovbl,almovax,mmovex,10mulexaddax,bxmovm,axjmplopnext:popdsretatoiendpcodeendsend3、两种数据段属性的区别:Common属性的数据段的特点是将其他与与此段同名、同类别的段从同一个地址开始装入,即各个逻辑段重叠在一起;而Public属性的数据段的特点是将其他与此段同名、同类别的段相邻的连接在一起,形成一个大的逻辑段。4、设计一个主程序模块,通过子程序调用的方式,将(1)和(2)执行后存放在k和m中的变量值取出来存放在该主程序定义的变量i和j中。其源代码如下:extrninput:far,atoi:far,m:wordpublicexitdatalsegmentcommonjdw30hdatalendsdata2segmentpublicidw20hdata2endsstacksegmentparastackdb20hdup(O)stackendscodesegmentassumecs:code,ss:stack,ds:data2start:movax,data2movds,axcallatoimovax,mmovi,axjmpinput

exit:movah,4chint21hcodeendsendstart5、调试程序:由图5.1可以看到起始是内存单元209EH:0000H的内容为0030h,且内存单元209EH:0010H的内容为0020hol=LbJE:0000I09E:000D09E:001A09E:002709E:003409El=LbJE:0000I09E:000D09E:001A09E:002709E:003409E:0041国9E:004E300000000000000000000000000000000000000000nenorulb00280000000000000000000000000000000000000000000000000000000000000000000图4.6初始内存单兀图当调用子程序atoi输入111后内存变化如图5.2所示,可以看到内存单元209EH:0020H的内容变为了6F,此内存单元为m所在的内存单元。因为i的初始值为20h,由此可以看到m的内存单元是连接在i所在数据段之后的。nemorulbg09E:0000209E:000D209E:001A209E:0027209Eg09E:0000209E:000D209E:001A209E:0027209E:0034209E:0041209E:004E00000A0H000000000000000WWHM”0 图4.7调用atoi后内存单兀图当执行movax,m,movi,ax之后内存单元变化如图5.3所示,可以看到原来存放20的内存单元变成了6F。此时完成了m到i的赋值。2萌?:萌萌B89F20HOUAX.209FB2。自7:8晒8ED8HOUDS,AX20自7:00059A0000OC20CALL2eAC:00e0A11000HWAX.WORDFkTR[0010]2Hft7:0H0DA39000MOUWORDPTR[0800KAXEAG800a92。JMP2gA9:0的0B44cMOU皿4cCD211NT2120自2:00190000ADDBVTEPTR(BX*SI)^L0000ADDBYTEPTR[BX*SILAL0900ADDBVTEPTR[跑㈠1LAL2Hft7:001F001EB89EADDBYTEPTR19BB8LBL20A7:0023208ED633ANDBYTEPTR(BP*33D8ECL20^7:0027D2B401CD???BYTEPTR[S1-32FFJ,CL23H7:0€2B213CANDWORDPTR(SI),DI2卅八郁2D0D7413OBAX,13742OA7:003033DBXORBX.BX2皿7:0032240FANDAL.0F2械?训348AD8MOUBL,AL2。由7:00368BC2HOUAX,DX兴^在着徭;:.衣求1lAJn^Roi*yl3X^tJ7£-vjXtjUuo207E:000R300000E)00000000000000000000 2H9E:000D0000007Q000000m00000000...3 209E:001A0。0000I)000006F000600000000...7..o 209E:0027000000£)000幽00008800000000 20?E:0034000000e助00000000ee00000000 20?E;0041000000E由08ee00B00000B00000 209E:004E000000c)000眄00008g00000000 NUZR图4.8完成m向i赋值后内存单元变化图=006F♦0001-000A・0000-0060■0000♦0000■=0000-209P-208E2MAI-20a7UPEIPE进入子程序input后,当循环输入完122并完成对k赋值后内存单元变化如图5.4所示,可以看到原来存30的位置,即原来j的位置变成了7A。这是因为在主函数和input子程序中的数据段datal都为Common属性,两个数据段的起始地址是一样的,而j和k分别都是两个数据段的第一个元素,所以j和k公用一个内存单元。所以改变k的值即是改变j的值,所以当k赋值完成后j也由30H变成了7AHOylieaiteaycnunacaprions aiasinaowseid|-(3J—sourcelCS:IP——2dA9:0001B89E20MOUAX.209E20A9:00949ED8MOUDS.AX26A9:900633D2XORDX.DX2M9:0008B401HOUAH.0120A9:。制ACD21INI2120A9:000C3C0DCMPALr0D20A9:000E7413JZ002320A9:001833DBXORBX.BX20A9,0012240PAMDAL.0P20A9:80148AD8HOUBL.AL20A9;00168BC2HOUax.DX20A9:0018B90A00MOUCX.008A20A9:001BF7E1HULCX20A9:001D03C3ADDAX,BX20A9:601F8BD0MOUDX"X2009:6021EBESJNP0M820A9:8023891600MHHOUWORDPTRI0000LDX20A9;0027IFPOPDS128A9:8028EA1S00A720 JMP20A7:00152dA9:002D0000ADDBYTEPTRIBX♦Sl1■«,...,../的3....弗209E:800D0000006F0000000000000000••.o.:12b,E:601A州W绸0000006F0a的0000ee00......12M9E:B027HU加UH0。eeBa00H000000000 :I209E:(W34 RH0800B000naee0600no00 ......I209E:©041000AA000000008ro00000000M :I209E:H04E 000。0000980006HU UMHUHH00 [—(7iste

AX-016DBX-0882CX-088ADX-007ASP-005Ebp-eeeeSI-0060DI-0060DS-209EES-20CESS-2%13246NUUPEIPLZRNAPENC五、结论本次实验的主要目的就是比较Common和Public两种属性的数据段在进行函数传递时的区别进而比较两种属性的区别。由实验结果可知Public属性的数据段是将同名的数据的段连接在一起;而Common属性的数据段是将同名同类别的数据段放在相同起始地址的内存单元中。所以子程序中Common属性的k能够覆盖主程序中Common属性j,而子程序中Public属性m只能拼接在主程序Public属性的数据i内存单元的后面。实验五汇编语言和C语言间的调用实验5.1C语言和汇编语言混合编程下的排序算法一、实验目的本次实验主要达到如下目的:利用c语言程序和汇编语言程序实现从键盘上输入的若干个数的排序。其中输入输出以及提示信息用c语言程序实现,排序操作用汇编程序实现。二、实验环境该试验包括的硬件和软件条件如下:1、硬件环境80386或以上系列PC机(2)内存不少于16M2、软件环境Dos+Win31或Windows95或以上版本操作系统(2)汇编语言编译软件Msam6.11三、实验步骤1、分别编写相应的C语言程序和汇编程序2、描述混合编译的过程3、撰写相应的实验报告四、实验结果及其分析1、编写程序(1)、在TurboC开发环境下编写C语言程序,从键盘上输入总数n及数组a[n];并调用外部函数sort(intn,inta[]),然后再输出由小到大排好序的数组a[n]。其程序如下所示:#includez/stdio.h"externintsort(intn,inta[]);voidmain()(inta[100],n,i;printf("'Pleaseinputthetotalnumber:");scanf&n);for(i=0;i<n;i++)scanf&a[i]);sort(n,a);printf(z,Aftersort:");for(i=0;i<n;i++)printf(〃%d",a[i]);printf('\n");)(2)、在汇编语言集成环境中编写如下的汇编程序程序:.modelsmall.codepublic_sort_sortprocorg2000hpushbpmovbp,spxorax,axmovax,[bp+4]movsi,[bp+6]xorbx,bxmovbx,2mulbladdax,sixorex,exmovex,axlopl: movdi,siadddi,2

温馨提示

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

评论

0/150

提交评论