您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 国内外标准规范 > JBT501891999JBT501891999JBT501891999
汇编语言课程实验报告实验名称课程设计1实验环境硬件平台:IntelCorei5-3210M操作系统:DOSBox0.74inWindows8.1软件工具:TurboC2.0,Debug,MASM实验内容将实验7中的Poweridea公司的数据按照下图所示的格式在屏幕上显示出来。实验步骤1.要完成这个实验,首先我们需要编写三个子程序。第一个子程序是可以显示字符串到屏幕的程序,其汇编代码如下:;名称:show_str;功能:在屏幕的指定位置,用指定颜色,显示一个用0结尾的字符串;参数:(dh)=行号,(dl)=列号(取值范围0~80),(cl)=颜色,ds:si:该字符串的首地址;返回:显示在屏幕上show_str:pushaxpushcxpushdxpushespushsipushdimovax,0b800hmoves,axmoval,160muldhadddl,dlmovdh,0addax,dxmovdi,axmovah,clshow_str_x:movcl,ds:[si]movch,0jcxzshow_str_fmoval,clmoves:[di],axincsiincdiincdijmpshow_str_xshow_str_f:popdipopsipopespopdxpopcxpopaxret2.第二个程序是将word型数据转换为字符串,这样我们才能调用第一个程序将其打印出来。第二个程序汇编代码如下:;名称:dtoc_word;功能:将一个word型数转化为字符串;参数:(ax)=word型的数据,ds:si指向字符串的首地址;返回:ds:[si]放此字符串,以0结尾dtoc_word:pushaxpushbxpushcxpushdxpushsimovbx,0dtoc_word_x:movdx,0movcx,10divcxmovcx,axadddx,'0'pushdxincbxjcxzdtoc_word_fjmpdtoc_word_xdtoc_word_f:movcx,bxdtoc_word_x1:popds:[si]incsiloopdtoc_word_x1popsipopdxpopcxpopbxpopaxret3.除了以上两个程序,我们还需要考虑一个问题,即有些数据已经大于65535,应该编写一个新的程序,将一个doubleword型数转化为字符串。汇编代码如下:;名称:dtoc_dword;功能:将一个doubleword型数转化为字符串;参数:(dx)=数的高八位,(ax)=数的低八位;返回:ds:[si]放此字符串,以0结尾;备注:会用到divdw函数dtoc_dword:pushaxpushbxpushcxpushdxpushsimovbx,0dtoc_dword_x:movcx,10calldivdwpushcxincbxcmpax,0jnedtoc_dword_xcmpdx,0jnedtoc_dword_xmovcx,bxdtoc_dword_x1:popds:[si]addbyteptrds:[si],'0'incsiloopdtoc_dword_x1popsipopdxpopcxpopbxpopaxret4.考虑到div指令除法溢出的问题,我们还需要写一个程序,进行不会产生溢出的除法运算,如下:;名称:divdw;功能:除法,被除数32位,除数16位,商32位,余数16位,不会溢出;参数:(dx)=被除数高16位,(ax)=被除数低16位,(cx)=除数;返回:(dx)=商高16位,(ax)=商低16位,(cx)=余数divdw:pushbxpushaxmovax,dxmovdx,0divcxmovbx,axpopaxdivcxmovcx,dxmovdx,bxpopbxret5.将这四个子程序整合起来,并编写主程序。主程序代码如下:assumecs:code;Ps:函数中的标号为防止冲突,都加了本函数名为前缀datasegmentdb'1975','1976','1977','1978','1979','1980','1981','1982','1983'db'1984','1985','1986','1987','1988','1989','1990','1991','1992'db'1993','1994','1995';以上是表示21年的21个字符串dd16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514dd345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000;以上是表示21年公司总收的21个dword型数据dw3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw11542,14430,45257,17800;以上是表示21年公司雇员人数的21个word型数据dataendsagencysegmentdb8dup(0)agencyendscodesegmentstart:movax,0b800hmoves,axmovdi,0movcx,80*24x:movbyteptres:[di],'';将屏幕清空movbyteptres:[di+1],0incdiincdiloopxmovax,datamoves,axmovdi,0movbx,0movax,agencymovds,axmovsi,0movdh,2movcx,21x1:pushcxmovax,es:[di]movds:[si],axmovax,es:[di+2]movds:[si+2],axmovbyteptrds:[si+4],0;显示年份movdl,0movcl,7callshow_strmovax,es:[84+di]pushdxmovdx,es:[84+di+2]calldtoc_dword;显示收入popdxmovdl,20movcl,7callshow_strmovax,es:[84+84+bx]calldtoc_wordmovdl,40;显示雇员数movcl,7callshow_strmovax,es:[84+di]pushdxmovdx,es:[84+di+2]divwordptres:[84+84+bx];计算人均收入并显示calldtoc_wordpopdxmovdl,60movcl,7callshow_stradddi,4addbx,2adddh,1popcxloopx1movah,0int16h;加上按任意键继续功能,可以直接双击运行movax,4c00hint21h编译链接程序,其运行效果如下:实验总结这个题目实际是前几个题目代码的整合,难点还是在于如何计算显示的行和列,如果错位了1个字节,显示的时候就可能出现重叠之类的情况。还有要再写个dword型数据转ASCII字符的程序,不过有之前的经验,应该也不难。通过此次的程序设计训练,基本上对之前所学的所有知识都有了一个系统性的掌握。
本文标题:JBT501891999JBT501891999JBT501891999
链接地址:https://www.777doc.com/doc-6413778 .html