您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 汇编语言程序设计-课程设计
一、实验目的1.熟练掌握call、ret的原理及应用2.熟练掌握子程序的框架、进行模块化程序设计3.掌握参数与结果的传递、批量数据传递等问题的解决方法二、实验内容及要求(一)综合程序设计:利用实验10中的三个子程序,将poweridea公司的数据按照下图所示的格式在屏幕上显示出来,要求计算人均收入并显示出来。poweridea公司的数据如下:assumecs:codesgdatasegmentdb'1975','1976','1977','1978','1979','1980','1981','1982','1983'db'1984','1985','1986','1987','1988','1989','1990','1991','1992'db'1993','1994','1995';年份dd16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514dd345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000;公司总收入dw3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw11542,14430,15257,17800;公司雇员人数dataendstablesegmentdb21dup('yearsummne??')tableends要求:(1)给出该设计过程或算法(2)在代码中必要的地方给出相应注释(3)最终显示结果。三、实验解答过程及结果(1)该题目的第一段db型年份数据是以字符串储存的,不适合后续的操作,所以先用ice子程序把年份数据转化为word型数据。接下来循环开始,先调用dtoc1子程序,把第一年(1975)的word型年份数据转化为字符串储存在es中,再调用show_str函数在屏幕缓冲区显示出来。接着调用dtoc2子程序和show_str子程序把第一年的收入在同一行显示出来。再接着调用dtoc1子程序和show_str子程序把第一年的雇员数在同一行显示出来,最后计算平均收入,同样调用两个子程序显示出来。不停地循环,循环21次,把所有的数据都显示出来,输入程序结果,程序完结。(2)代码及数据如下:assumecs:codesgdatasegmentdb'1975','1976','1977','1978','1979','1980','1981','1982','1983'db'1984','1985','1986','1987','1988','1989','1990','1991','1992'db'1993','1994','1995';年份dd16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514dd345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000;公司总收入dw3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw11542,14430,15257,17800;公司雇员人数dataendstablesegmentdb21dup('yearsummne??')tableendsstacksegmentdb1024dup(0)stackendscodesgsegmentstart:movax,datamovds,axmovax,tablemoves,axmovax,stackmovss,axmovsp,1024movsi,0movbx,0movdh,5movax,1975;初始化,dh为输出时的行数movcx,21so:callicepushaxmovax,ds:[si]calldtoc1popaxpushcxmovdl,1movcl,00000111bcallshow_strpopcx;这两段输出年份pushaxpushdxmovax,ds:[si+84]movdx,ds:[si+86]calldtoc2popdxpopaxpushcxmovdl,8movcl,00000111bcallshow_strpopcx;这两段输出收入pushaxmovax,ds:[bx+168]calldtoc1popaxpushcxmovdl,18movcl,00000111bcallshow_strpopcx;这两段输出雇员数pushaxpushdxmovax,[si+84]movdx,[si+86]divwordptrds:[bx+168];计算人均收入,结果为16位,保存在ax中calldtoc1popdxpopaxpushcxmovdl,26movcl,00000111bcallshow_strpopcx;这两段输出平均收入addsi,4addbx,2incdhincaxloopso;循环21次,增加参数movax,4c00hint21h;名称:ice;功能:在ds:si开始,以“数据”“0”的格式用新数据替换旧数据(即年份字符串);参数:(ax)=word型的数据,es:si指向字符串的首地址;返回:无;说明:把字符串的年份转化为word型数据,并以0结尾,方便dtoc1函数的调用ice:pushbxmovds:[si],axmovbx,0movds:[si+2],bxpopbxret;名称:dtoc1;功能:将一个word型数转化为字符串,数应不大于65535;参数:(ax)=word型的数据,es:si指向字符串的首地址;返回:es:[si]放此字符串,以0结尾;说明:因为ds放了数据段,为免混淆,把字符串放在es里,下面的函数也相同dtoc1:pushcxpushbxpushdxmovdx,0pushdipushsimovdi,0cir1:movcx,10divcxadddx,30hmovbx,dxpushbxincdimovdx,0movcx,axjcxzowjmpshortcir1ow:movcx,dis:popbxmoves:[si],bxincsiloopspopsipopdipopdxpopbxpopcxret;名称:dtoc2;功能:将一个dword型数转化为字符串,数不应大于FFFFFFFFFFFFFFFF;参数:(ax)=dword型的数据的低16位,(dx)=dword型的数据的高16位,es:si指向字符串的首地址;返回:es:[si]放此字符串,以0结尾dtoc2:pushcxpushbxpushsipushdimovdi,0cir2:movcx,10calldivdwaddcx,30hmovbx,cxpushbxincdimovbx,dxaddbx,axmovcx,bxjcxzoxjmpshortcir2ox:movcx,dis8:popbxmoves:[si],bxincsiloops8popdipopsipopbxpopcxret;名称:divdw;功能:除法,被除数32位,除数16位,商32位,余数16位,不会溢出;参数:(dx)=被除数高16位,(ax)=被除数低16位,(cx)=除数;返回:(dx)=商高16位,(ax)=商低16位,(cx)=余数divdw:pushbxpushaxmovax,dxmovdx,0divcxmovbx,axpopaxdivcxmovcx,dxmovdx,bxpopbxret;名称:show_str;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串;参数:(dh)=行号(1~25),(dl)=列号(1~80),(cl)=颜色,es:si指向字符串的首地址;返回:无show_str:pushdipushsimovdi,0pushaxpushdxdecdhdecdl;这里采用习惯上的叫法,放在显示缓冲区最开头就是1行1列moval,160;1行80个字符,一个字符2个字节muldhadddl,dl;一个字符2个字节movdh,0adddx,axadddi,dx;这几行是为了计算字符串首的偏移地址movah,cl;字符的高位保存属性,低位保存数据pushcxchange:movcl,es:[si]movch,0jcxzokmoval,es:[si]pushespushaxmovax,0b800h;显示缓冲区的空间为B8000H~BFFFFHmoves,axpopaxmoves:[di],ax;输出到缓冲区popesincsiadddi,2jmpshortchangeok:popcxpopdxpopaxpopsipopdiretcodesgendsendstart(3)结果如图:四、实验总结通过这次实验,我学会了call和ret指令的用法,学会了编写子程序以及调用各个子程序,组成一个大程序。我发现,汇编的子程序,就跟c语言的函数差不多。在实验的过程中,我学会了编写更加复杂的程序,懂得了更多的汇编知识,在汇编语言的学习上又有了新的进步。
本文标题:汇编语言程序设计-课程设计
链接地址:https://www.777doc.com/doc-6469259 .html