您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 集美大学汇编课程设计报告
《汇编语言程序设计》课程设计题目:题目四—数的处理三专业:计算机科学与技术学号:201221034013姓名:江玲微2013-2014学年第一学期一.设计目的(1)了解并掌握汇编语言设计的一般方法,具备初步的独立分析和设计能力;(2)掌握显示输出、键盘输入DOS功能调用的使用方法;(3)学习汇编程序的总体设计与应用方法。二.设计内容从键盘输入一个4*4的矩阵。要求:(1)每个元素都是4位的十进制数。(2)在屏幕上输出该矩阵和它的转置矩阵。(3)输出这两个矩阵的和(对应元素相加)。三.程序设计原理(1)输入矩阵的方法:调用输入一个四位数的子程序INPUT,并用一个内外循环使输入的一串数字以矩阵的形式显示,并将矩阵保存在matrix1单元中。子程序INPUT描述:A.保护寄存器,并将AX清零,防止影响下一个输入的数;B.设置循环次数,输入一个字符,并判断是否是数字,是则继续新输入;C.循环输入四个数字,并将输入的四个数字转换成数字,并保存在C1中;D.恢复寄存器。(2)输出矩阵的方法:设置指针SI指向matrix1单元的首地址,后调用子程序OUTPUT输出矩阵。子程序OUTPUT描述:A.设置输出的行数和列数;B.将matrix1单元中的内容即[SI]中的内容送给AX,后调用子程序SC显示一个十进制数。C.显示一个空格,调整指针指向下一个数;D.列输入结束,行输入结束。子程序SC描述:A.将AX依次除以10000,若商为0,说明输出的是四位的十进制数,就跳至显示空格并继续将余数除以1000、100、10并将商和最后的余数依次输出;B.若商不是零则依次将余数除以1000、100、10并将商和最后的余数依次输出。(3)矩阵转置的方法:运用传送字符串的方法先将matrix1单元中的内容依次送到matrix2单元中,后调用子程序ZH将matrix2中的内容进行转置。子程序ZH描述:对角线上的数无需进行交换,第一行和第一列只要交换三个数字,第二行和第二列只要交换两个数字,第三行和第三列只要交换一个数字,总共交换三次即可。A.保护寄存器,设置外循环次数3;B.设置BX、SI、DI、的初始值,并设置内循环次数DX;C.交换相应位置的数字,先判断内循环是否结束;D.判断外循环是否结束,恢复寄存器。(4)显示转置矩阵:将SI清零,将指针SI指向matrix2单元的首地址,后调用子程序OUTPUT即可显示转置矩阵。子程序OUTPUT的描述在(3)中。(5)矩阵相加:将指针SI指向matrix1单元的首地址,将指针DI指向matrix2单元的首地址,调用子程序ADDUP进行矩阵相加,并将相加后的结果保存到matrix3单元中。子程序ADDUP描述:A.保护寄存器,并将DX清零,设置循环次数16;B.将matrix1单元中的内容存到AX中,将matrix2单元中的内容存到BX中,把相加后的结果保存到AX中,并送到matrix3单元中,依次循环16次;D.恢复寄存器。(6)输出相加后的矩阵:将指针SI清零并指向matrix3单元的首地址,后调用子程序OUTPUT即可。四.程序流程图主程序流程图:子程序INPUT:开始调用子程序INPUT输入矩阵调用子程序OUTPUT输出原矩阵调用子程序ZH完成矩阵转置调用子程序OUTPUT输出转置后的矩阵调用子程序ADDUP进行矩阵相加调用子程序OUTPUT输出相加后的矩阵结束开始输入一个字符AL30H?AL39H?AL→BLBL-30HC1=C1*10+BXDI=0?YNYN结束YN子程序ZH:子程序OUTPUT:开始DX←CX将matrix2[SI]与matrix2[DI]交换SI=SI+2DI=DI+8DX=DX-1DI←BXDI=DI+16BX=BX+10SI←BXDX=0?CX=0?结束NYNY开始CX进栈AX←[SI]调用子程序SC显示一个十进制数CX=0?(判断列数)CX=0?(判断行数)CX出栈结束SI=SI+2CX←4CX进栈CX←4显示空格YNYN子程序ADDUP:子程序ZH:开始AX、BX清零AX←[SI]BX←[DI]AX=AX+BXMatrix3[BP]←AXCX=0?BP=BP+2SI=SI+2DI=DI+2结束NY开始AX←[SI]AX除以10000判断商是否为0?显示空格将余数除以1000显示商将余数除以100显示商将余数除以10先显示商,再显示余数显示空格结束显示商YN五.源程序DATASEGMENTSTRDB'pleaseinputthe4*4matrix:','$';提示输入矩阵STR1DB0DH,0AH,'theoriginalmatrix:','$';提示输出原矩阵STR2DB0DH,0AH,'thetransposedmatrix:','$';提示输出转置矩阵STR3DB0DH,0AH,'theansweris:','$';提示输出矩阵相加的和C1DW0C2DW10NEQU4matrix1DW16DUP(?);定义存储原矩阵的空间matrix2DW16DUP(?);定义存储转置矩阵的空间matrix3DW16DUP(?);定义存储相加后的矩阵的空间DATAENDSenterMACRO;编写回车换行的宏,便于后面调用MOVAH,02HMOVDL,10INT21HMOVDL,13INT21HENDMCLSMACRO;编写清除全屏的宏MOVAH,6;屏幕初始化MOVAL,0;全屏空白MOVBH,7;卷入行属性(黑底白字,正常显示)MOVCH,0;左上角行号MOVCL,0;左上角列号MOVDH,24;右上角行号MOVDL,79;右上角列号INT10H;BIOS调用MOVDX,0;把光标定位在0行0列MOVAH,2MOVBH,0INT10HENDMCODESEGMENT;定义代码段ASSUMECS:CODE,DS:DATA,ES:DATASTART:MOVAX,DATAMOVDS,AXMOVES,AXCLSLEADX,STR;提示输入矩阵MOVAH,09HINT21Henter;回车换行MOVSI,0MOVCX,4;设置循环次数K0:MOVBX,4L0:CALLINPUT;调用输入一个四位数的子程序MOVAX,C1;将输入的的数字存到matrix1单元中MOVmatrix1[SI],AXADDSI,2MOVAH,2MOVDL,20HINT21HMOVC1,0DECBXJNZL0enterLOOPK0;输入结束LEADX,STR1MOVAH,09HINT21HenterMOVSI,0LEASI,matrix1CALLOUTPUT;调用输出矩阵子程序LEADX,STR2;显示输出转置矩阵的提示信息MOVAH,09HINT21HenterLEASI,matrix1;将matrix1单元中的内容传到matrix2单元中LEADI,matrix2MOVCX,16CLDREPMOVSWMOVSI,0;SI清零LEASI,matrix2;将matrix2的首地址赋给SICALLZH;调用转置矩阵子程序,将matrix2中的内容改变CALLOUTPUT;调用矩阵输出子程序显示转置后的矩阵LEADX,STR3MOVAH,09HINT21HenterMOVSI,0;矩阵相加程序MOVDI,0MOVBP,0MOVCX,0LEASI,matrix1LEADI,matrix2CALLADDUPMOVSI,0LEASI,matrix3CALLOUTPUT;输出相加后的矩阵MOVAH,4CHINT21HZHPROCNEAR;矩阵转置子程序PUSHSI;保护现场PUSHDIMOVCX,N-1;设置外循环次数MOVBX,2;设置初始值MOVSI,2MOVDI,2*NLOP1:MOVDX,CX;设置内循环次数LOP2:MOVAX,matrix2[SI];进行数字的交换XCHGAX,matrix2[DI]MOVmatrix2[SI],AXADDSI,2ADDDI,8DECDXJNZLOP2;完成第一行和第一列的交换MOVDI,BXADDDI,4*NADDBX,2*(N+1)MOVSI,BXLOOPLOP1;外循环结束,转置完成POPDI;恢复现场POPSIRETZHENDPINPUTPROCNEAR;输入一个四位数字的子程序PUSHAX;保护现场PUSHBXPUSHCXPUSHDIXORAX,AX;清零S:MOVDI,4;设置循环次数S1:DECDIMOVAH,01H;输入一个字符INT21HCMPAL,30H;判断是否是数字JBSCMPAL,39HJASXORBL,BL;清零MOVBL,ALSUBBL,30H;把ASCⅡ码转换成数字XORDX,DX;清零MOVAX,C1;保存累加后的数字MULC2ADDAX,BXMOVC1,AXCMPDI,0;判断循环是否结束JNZS1POPDI;恢复现场POPCXPOPBXPOPAXRETINPUTENDPOUTPUTPROCNEAR;输出矩阵子程序MOVCX,4;设置输出的行数L1:PUSHCXMOVCX,4;设置输出的列数L2:PUSHCXCALLSCMOVDL,20H;显示空格MOVAH,02HINT21HPOPCXADDSI,2LOOPL2;列输出完毕enterPOPCXLOOPL1;行输出完毕RETSCPROCNEAR;输出一个十进制数的子程序MOVDX,0MOVAX,[SI]MOVCX,10000DIVCXMOVBX,DX;将余数送到BX中MOVDL,AL;将商送到DL中进行判断CMPDL,0JZL3ADDDL,30HMOVAH,02HINT21HJMPL4L3:MOVDL,20H;若是四位的十进制数,则先显示空格,以便对齐MOVAH,02HINT21HL4:MOVDX,0MOVAX,BXMOVCX,1000DIVCXMOVBX,DXMOVDL,ALADDDL,30H;显示下一位MOVAH,02HINT21HMOVAX,BXMOVCL,100DIVCLMOVBL,AHMOVDL,ALADDDL,30H;显示下一位MOVAH,2HINT21HL5:MOVAL,BLMOVAH,0MOVCL,10DIVCLMOVBL,AHMOVDL,ALADDDL,30H;显示下一位MOVAH,02HINT21HMOVDL,BL;显示最后一位ADDDL,30HMOVAH,02HINT21HRETSCENDPOUTPUTENDP;矩阵相加子程序ADDUPPROCNEARPUSHAXPUSHBXMOVDX,0MOVCX,16;设置循环次数J0:XORAX,AX;清零XORBX,BXXORDX,DX;进行矩阵相加,并将相加后的每一个数存入matrix3中MOVAX,[SI]MOVBX,[DI]ADDAX,BXADDDX,AXMOVmatrix3[BP],DXADDBP,2ADDSI,2ADDDI,2LOOPJ0POPBXPOPAXRETADDUPENDPCODEENDSENDSTART六.调试过程七.遇到的问题及解决方法1.因为本程序要多次用到回车换行,因此定义了一个回车换行的宏便于调用。2.输入矩阵时调用的子程序INPUT编写的时候出现问题:(1)因为调用01号功能输入字符,存在AL中的是ASCⅡ码,所以还应该将输入的四位字符进行转换成实际的四位十进制数的形式;(2)没有将AX清零,因而影响到后面累加后的结果导致输出发生错误。3.输出矩阵子程序OUTPUT出现的问题:(1)没将地址指针SI清零;(2)输出矩阵时发现类似10086的数字只会显示1086而中间少了个0。是因为在L3中多加了一句判断DL是否为零的语句导致结果出现错误;(3)在显示相加后的矩阵时,会有四位和五位的导致显示时会不对齐。这样在输出四位的十进制数时就应在其前方加一个空格。但这时又出现了一个问题:在没编写SC子程序时,将其直接放在OUTPUT子程序中时,出现下面的问题因此采用在子程序OUTPUT中再调用SC子程序,解决了此问题。4.转置矩阵子程序编写时出现的问题:(1)初始值设置不对导致转置错误;(2)内循环的设置
本文标题:集美大学汇编课程设计报告
链接地址:https://www.777doc.com/doc-5502100 .html