您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 四川大学微机原理实验报告
微机原理实验报告学院:专业班级:姓名学号实验一汇编语言编程基础1.3汇编语言程序上机操作和调试训练一.功能说明运用8086汇编语言,编辑多字节非压缩型BCD数除法的简单程序,文件名取为*.ASM。运用MASM﹒EXE文件进行汇编,修改程序中的各种语法错误,直至正确,形成*.OBJ文件。运用LINK.EXE文件进行连接,形成*.EXE文件。仔细阅读和体会DEBUG调试方法,掌握各种命令的使用方法。运用DEBUG。EXE文件进行调试,使用单步执行命令—T两次,观察寄存器中内容的变化,使用察看存储器数据段命令—D,观察存储器数据段内数值。再使用连续执行命令—G,执行程序,检查结果是否正确,若不正确可使用DEBUG的设置断点,单步执行等功能发现错误所在并加以改正。二.程序流程图设置被除数、商的地址指针设置单位除法次数计数器取被除数一位作十进制调整作字节除法、存商N被除数各位已除完?Y显示运算结果结束三.程序代码修改后的程序代码如下:DATASEGMENTADB9,6,8,7,5BDB5CDB5DUP(0)NEQU5DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATASTART:MOVAX,DATAMOVDS,AXMOVES,AXCLDLEASI,ALEADI,CMOVCX,NMOVAH,0LP1:LODSBAADDIVBSTOSBLOOPLP1MOVCX,NLEADI,CLP2:MOVDL,[DI]ADDDL,30HMOVAH,2INT21HINCDILOOPLP2MOVAH,4CHINT21HCODEENDSENDSTART四.实验感想和收获通过这次试验,我对微机原理上级试验环境有了初步的认识,可以较为熟练地对汇编语言进行编译,汇编及连接,同时也学会了用DEBUG调试程序,收获很大。在这次试验中我也遇到了一些困难。在刚开始我发现自己无法打开MASM.EXE,计算机提示是由于版本不兼容。我这才想起来我的操作系统是64位的,和该软件版本不兼容。不过我并没有放弃,经过我的摸索之后,我发现用DOSBOX这个程序可以解决我的电脑运行不了该程序的问题。在解决了第一个难题后,我开始着手改正试验1.3中的语法错误和逻辑错误,但是无论我怎么修改却始终都无法通过编译,并且基本上每句话都有编译错误。根据我多年编程的经验来看,这应该是中文输入法在搞鬼,之后我耐心地把程序重新输了一遍,果然通过了编译,并且之后的连接也进行的很顺利。在用DEBUG调试时发现得出的结果也很正确。尽管这次的实验内容非常简单,仅仅是教会我们一些基本的操作,但我却明显感觉到了汇编语言和C语言等高级语言所不同的地方。越是底层,基础的东西就越不人性化,用C语言一行代码就能实验的功能在汇编语言中可能要花上数十行。看来汇编语言的学习不是几周就能速成的,必须要有长年累月的积淀才能掌握。实验二设计汇编语言程序一.功能说明练习1.实验题目:编程计算下列表达式:A=90,B=-70,C=5,Y均为有符号数,计算Y=2×(A+B)+(A×C)÷5要编写一些稍微复杂的程序,我们会遇到一段程序被反复执行,这样,我们会用到LOOP指令。使用该指令时,需在CX中装入循环次数。练习2.码转换程序设计编制程序,把十进制数15786转化成二进制数。提示:15786=1×10×10×10×10+5×10³+7×10²+8×10+6,循环CX=5练习3.编制程序,从键盘输入最多5个数,求他们的和,存入SUM。练习4.用“冒泡“法对一组数300,250,280,240,260,按从小到大的顺序排列。提示:用冒泡的方法对一组数据元素排序,它的基本方法是:将相邻的两个元素通过比较进行排序,通过多次,多遍的邻元素排序,实现整个一组数的排序。对于5(N)个元素,整个排序通过4遍(=N-1)邻元素排序完成。每一遍的排序由若干次邻元素的排序组成。4遍排序中,邻元素的排序依次为4,3,2,1遍。完成第一遍排序后,最大数沉底,已经到达它应占据的位置,不需要参加下一遍的排序。外循环的次数为CX=4次(N-1),内循环的次数为4,3,2,1(DECCX)排序遍数本遍排序前第一次排序后第二次排序后第三次排序后第四次排序后1300,250,280,240,260250,300,280,240,260250,280,300,240,260250,280,240,300,260250,280,240,260,3002250,280,240,260,300250,280,240,260,300250,240,280,260,300250,240,260,280,3003250,240,260,280,300250,240,260,280,300240,250,260,280,3004240,250,260,280,300240,250,260,280,300实验要求:1.编制程序,从键盘输入300,250,280,240,260这五个数,并思考如何输入任意五个数,五个数可以有一位数,二位数,三位数,四位数,五位数,混合输入比较大小;2.对这组数用冒泡法进行排序,并输出原始数据及排序后数据,两两数据之间用空格分隔;3.利用DEBUG调试工具,用D0命令,查看排序前后,内存数据的变化,以及会用调试命令查看程序运算中寄存器中的值;4.去掉最大和最小的两个值,求出其余值的平均值,并输出最大值,最小值和平均值;5.用压栈PUSH和出栈POP指令“先进后出”的特点,设计算法将平均值按位逐个输出(即输出263);6.用移位指令将平均值以二进制串的形式输出。7.设计程序要有模块化的思想,用子程序实现不同的功能;所有数据输出前要用字符串的输出指令,进行输出提示(如:zuidazhishi:300等),所有数据结果能清晰地显示在电脑屏幕上。二.程序流程图开始输出'QINGSHURU5GESHUJU'提示输入数据输入5个待排序的数据输出'PAIXUHOUDESHUJUSHUNXUSHI:'CX=4(外循环)CX入栈指针指向第一个数比较相邻两数大小,前一个数比后一个小?CX减1,指针指向下一个数Y将这两个数交换位置NCX=0?N外循环CX出桟并减1YCX=0?N输出排序后的五个数据Y输出’ZUIDAZHISHI:’输出第5个数即最大值输出’ZUIXIAOZHISHI:’输出第1个数即最小值输出’PINGJUNZHISHI:’CX=3指针指向第二个数将其由ASCII码转换成2进制数HE=0HE=HE+该二进制数CX=0?指针指向下一个数NHE除以3得到平均值YCX减1CX减1将平均值按位转换为ASCII码逐个输出输出’PINGJUNZHIDEERJINZHICHUANSHUCHU:’设置CX=16,SI=0,数据段设置变量STR1DB16DUP(30H)将平均值(二进制)带进位左移一位CF=0?将[STR+SI]对应的字符输出Y将[STR+SI]加1NSI加1CX减1CX=0?结束YN三.程序代码练习一:DATASEGMENTADB90BDB-70CDB5YDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBL,AMOVCL,BADDBL,CL;A+BMOVAL,02HIMULBL;2*(A+B)MOVBX,AXMOVAL,AMOVCL,CIMULCL;A*CIDIVCL;A*C/5ADDAX,BXMOVY,AXMOVAH,4CHINT21HCODEENDSENDSTART练习二:DATASEGMENTADW15786DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBX,AMOVCX,16LEFT:TESTBX,8000HJNZL1;当首位为1,执行L1MOVDL,'0';输出‘0’MOVAH,02HINT21HSHL:SHLBX,1LOOPLEFTMOVAX,4CHINT21HL1:MOVDL,'1';输出‘1’MOVAH,02HINT21HJMPSHLCODEENDSENDSTART运行结果:练习三:DATASEGMENTSUMDW?HEHEDB?,?,?,?,?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEASI,HEHEMOVBL,0MOVCX,5LOOP1:MOVAH,01HINT21HSUBAL,30HMOV[SI],ALINCSILOOPLOOP1MOVCX,5MOVAX,0SUBSI,5LOOP2:ADDAL,[SI]AAAINCSILOOPLOOP2MOVBX,AXMOVSUM,AXMOVDL,BHADDDL,30HMOVAH,2INT21HMOVDL,BLADDDL,30HMOVAH,2INT21HMOVAH,4CHINT21HCODEENDSENDSTART运行结果:冒泡排序法程序:DATASSEGMENTSHURUDB'QINGSHURU5GESHUJU',13,10,'$'SHU1DB4,?,3DUP(?)SHU2DB4,?,3DUP(?)SHU3DB4,?,3DUP(?)SHU4DB4,?,3DUP(?)SHU5DB4,?,3DUP(?)AVERDB3DUP(?)SHUCHUDB'PAIXUHOUDESHUJUSHUNXUSHI',':','$'MAXDB'ZUIDAZHISHI',':','$'MINDB'ZUIXIAOZHISHI',':','$'AVERAGEDB'PINGJUNZHISHI',':','$'CHUSHUDB100,10HEDW?STR1DB16DUP(30H)STR2DB'PINGJUNZHIDEERJINZHICHUANSHUCHU',':','$'DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXMOVES,AXLEADX,SHURU;显示QINGSHURU5GESHUJU:MOVAH,9INT21HMOVCX,5;输入五个数字MOVSI,0INPUT:LEADX,[SHU1+SI];输入要排序的原始数据MOVAH,10INT21HMOVDL,10;输入后换行MOVAH,2INT21HADDSI,5;指针加5,指向下一个变量LOOPINPUTCLDMOVCX,4;设定排序外循环次数A:MOVBP,0PUSHCX;外循环次数入栈PX:PUSHCXMOVCX,3LEASI,[SHU1+BP+2];逐位比较两个数大小LEADI,[SHU1+BP+7]REPZCMPSBJBB;如果小于直接比较下一个数,否则两个数对换位置MOVCX,3Jh:MOVAL,SHU1[BP+2]XCHGAL,SHU1[BP+7];将两个字节对换位置,循环3次即完成这两个数的交换XCHGAL,SHU1[BP+2]INCBPLOOPJhSUBBP,3B:ADDBP,5;指向后面两个数字POPCXLOOPPXPOPCX;外循环次数出栈LOOPALEADX,SHUCHU;输出字符串'PAIXUHOUDESHUJUSHUNXUSHI:'MOVAH,9INT21HMOVCX,5MOVSI,2OUTPUT:PUSHCX;计数器入栈实现循环嵌套MOVCX,3L:MOVAL,[SHU1+SI];输出排序后的5个数字MOVDL,ALMOVAH,2INT21HINCSILOOPLMOVDL,2CHMOVAH,2INT21HADDSI,2POPCX;计数器出栈LOOPOUTPUTMOVDL,10MOVAH,2INT21HMOVDL,0DHMOVAH,2INT21HLEADX,MAX;输出字符串'ZUIDAZHISHI:'MOVAH,9INT21HMOVCX,3MOVSI,2D:MOVDL,[SHU5+SI];输出最大值MOVAH,2INT21HINCSILOOPDMOVDL
本文标题:四川大学微机原理实验报告
链接地址:https://www.777doc.com/doc-5217286 .html