微机原理与应用课程实验报告实验分工:报告人同组人实验时间:2014.12.10课程设计一、题目要求(1)在数据段首址为0100H开始的内存区1按从大到小的顺序顺次存入二进制数15~0共16个字节的数据;(2)将上述源区内容传送到目的内存区2(首址为1100H)中;(3)检验上述传送过程是否正确,如有错误,在紧跟内存区2后的第一个字节开始写入ASCII码“ERROR”,否则写入“OK”。(4)用冒泡法将上述内存区2的数据,按从小到大的次序重新排列,排列后存放在内存区3(开始地址为2100H)。(5)将上述内存区2和内存区3的第100个数据分别乘以2,并转为BCD码,保存在各自存储区的末尾。再将上述两个BCD码相乘,其结果保存在内存区1的末尾处。二、实验程序框图三、程序代码codesegmentassumecs:codeDATA1db16dup(?)DATA2db'ERROR'DATA3db'OK';在数据段首址为0100H开始的内存区1按从大到小的顺序顺次存入二进制数15~0共16个字节的数据start:movax,0100h;规定目标程序存放单元的偏移量movds,ax;数据段地址moves,axmovsi,offsetDATA1;偏移地址movcx,0010H;循环次数movbx,0100Hmoval,ofHS1:movcs:[si],almov[bx],cs:[si]incsiincbxdecalloopS1nop;将内存区1数据搬移到内存区2中movcx,16movsi,0100hmovbx,1100hS2:moval,[si]mov[bx],alincsiincbxloopS2nop;对比内存区1的数据与内存区2的数据是否相同movcx,16movsi,0100hmovbx,1100hcomp:movax,[si]movdx,[bx]cmpax,dxjneerroincsiincbxloopcomp;数据如果都相同,说明上述传输过程正确movsi,offsetDATA3movdi,1110hmovbl,0movcx,2enterOK:movbl,cs:[si]mov[di],blincsiincdiloopenterOKnopjmpS3;如果有一个数据不相同,说明上述传输过程不正确err:movsi,offsetDATA2movdi,1110hmovbl,0movcx,5enterERR:movbl,cs:[si]mov[di],blincsiincdiloopenterERR;将内存区2数据搬移到内存区3中S3:movsi,1100hmovcx,0010hmovbx,2100hmoval,0movcx,16fil:moval,[si]mov[bx],alincsiincbxloopfilnop;用冒泡法将内存区3的数据按从小到大重新排列S4:movbl,0movcx,16movsi,2110hdecsideccxagain:moval,[si]cmpal,[si-1]jaenextxchgal,[si-1]mov[si],almovbl,1next:decsiloopagaincmpbl,0jnestart1nopmovsi,1109hmoval,[si]movcl,2mulcl;结果在al中movdx,0movbx,10divbxshlal,4addal,dl;把二进制数转换成BCD码mov[1112h],almovsi,2109hmoval,[si]movcl,2mulcl;结果在al中movdx,0movbx,10divbxshlal,4addal,dl;把二进制数转换成BCD码mov[2110h],al;两个BCD码相乘,其结果保存在内存区1的末尾处。movsi,1112hmovah,[si]movcl,4shrah,clmoval,ahmovdl,10muldl;结果在al中movdl,[si]anddl,0fhaddal,dlmovbl,al;resultmovsi,2110hmovah,[si]movcl,4shrah,clmoval,ahmovdl,10muldlmovdl,[si]anddl,0fhaddal,dl;结果在al中mulblmov[0110h],alcodeendsendstart四、实验结果(1)在数据段首址为0100H开始的内存区1按从大到小的顺序顺次存入二进制数15~0共16个字节的数据;(2)将上述源区内容传送到目的内存区2(首址为1100H)中;(3)检验上述传送过程是否正确,如有错误,在紧跟内存区2后的第一个字节开始写入ASCII码“ERROR”,否则写入“OK”。(4)用冒泡法将上述内存区2的数据,按从小到大的次序重新排列,排列后存放在内存区3(开始地址为2100H)。(5)将上述内存区2和内存区3的第100个数据分别乘以2,并转为BCD码,保存在各自存储区的末尾。再将上述两个BCD码相乘,其结果保存在内存区1的末尾处。内存区2内存区3内存区1末尾处五、分析与总结本课程设计是对微机原理实验的综合运用,涉及做过的每个子实验且在此基础上有所改进,并活用了学过的微机原理知识,充分考察了对于程序语言的阅读和编写能力。在这个设计实验中因为程序较长,出现错误比较难以改正,又由于自己完成实验时运用的软件不同,导致在寻找程序内存区时有一定困难,但这些问题在土同学们讨论和老师的指导下都得以解决。本次课程设计及实验内容让我受益匪浅且巩固了微机原理的基础知识。实验一、汇编语言程序基本操作一、实验目的1.熟悉EL微机实验系统的操作。2.掌握汇编语言设计和调试方法。二、实验内容1.把2000H-20FFH的内容清零。2.把源RAM区(首址为2200H)内100H个字节的数据,传送到目的RAM区(首址为2000H)。三、实验程序框图1.清零程序框图2.数据传送程序框图四、实验步骤1.EL微机实验系统与PC机联机(1)打开EL微机实验系统电源,初始化后,数码管显示“P_”,表示实验系统处于下位键盘监控状态。初始化SI、DI目标单元置数循环次数CX=100HCX=0?空操作结束开始初始化SI、DI源区数据传送到目的区数据循环次数CX=100HCX=0?空操作结束开始(2)在PC机处于在Windows软件平台下,单击EL86图标,根据屏幕提示进行联机操作,实验系统数码管显示“C_”,表示实验系统处于上位PC机监控状态。2.编辑程序选择“打开”菜单,打开现有的程序(清零实验程序名:RAM0.ASM)或者选择“新建”菜单,编辑新程序。(编辑新程序注意:在org100h的下一行,必须写标号start.)3.编译程序编译并连接程序,信息窗口显示“程序下传正确”,表示编译、连接成功。如果显示“程序下传不正确”,则应选择“运行”菜单中“系统复位”操作,然后重新进行编译、连接。4.运行程序在“运行”菜单中可选择多种手段进行调试运行。建议设立断点后再运行程序。5.检查运行结果在内存窗口检查运行结果。修改内存地址时,将光标移动到内存显示区的头部,右击鼠标,在弹出菜单选择修改内存地址,即弹出地址输入窗口,输入相应的地址即可。五、程序代码1.2000H-20FFH清零程序CODESEGMENTASSUMECS:CODEORG0100HSTART:MOVAX,0100HMOVDS,AX;段基址MOVES,AXMOVSI,1000H;偏移地址MOVCX,0100H;设置循环次数ANDAL,0QINGLING:MOV[SI],ALINCSIDECCXJNZQINGLING;置完100H个数后循环终止NOP;设置断点处JMPSTARTCODEENDSENDSTART2.数据传送程序CODESEGMENTASSUMECS:CODEORG0100HSTART:MOVAX,0100HMOVDS,AX;段基址MOVES,AXMOVDI,1000H;目的数据区偏移地址MOVSI,1200H;源数据区偏移地址MOVCX,0100H;设置循环次数S1:MOV[SI],10H;将源RAM区数据置10HINCSILOOPS1MOVSI,1200HMOVCX,0100HS2:MOVAL,[SI];将源数据通过AL传送到目的数据区MOV[DI],ALINCSIINCDIDECCXJNZS2NOP;设置断点处CODEENDSENDSTART六、程序调试过程1.清零2.数据传送将1200H作为源数据区,其中数据置为10H,并通过AL传送到目的数据区1000H。七、分析与总结通过“汇编语言程序基本操作”作为第一个实验,让我们熟悉了emu8086软件,也熟悉了微机原理课程中学习到的编程语言,并学会阅读、修改甚至编写程序。清零和数据传输程序作为最基础也是最重要的两类程序,虽然刚上手做的比较费力,但也为下面的实验内容打下了基础。实验二排序实验一、实验目的掌握多重循环设计及调试方法。二、实验内容编写并调试一个排序子程序,其功能为用冒泡法将16个无符号的正整数,按从小到大的次序重新排列。三、实验程序框图YYNNY开始清交换标志、置数组长度、变址值初始化取[si]修改变址值交换内容,置标志位CX←比较次数[si]≥[si-2]?比较完否?N交换标志为零?结束四、实验步骤1.在RAM区2000H-201FH中放入不等的数据。2.编辑程序。3.编译、连接程序。4.在程序中检查交换标志语句前设立断点后再运行程序。5.在内存窗口检查运行结果,并记录。地址初始状态第一遍扫描第二遍扫描第三遍扫描第四遍扫描第五遍扫描第六遍扫描第七遍扫描第八遍扫描第九遍扫描第十遍扫描第十一遍扫描20001211111111111111111111112002151212121212121212121212200446151515151515151515151520063846191919191919191919192008893846222222222222222222200A438938462727272727272727200C274389384633333333333333200E65274389384638383838383820101965274389384643434343432012761965274389434646464646201455767665654389555555555520163355557676655589616161612018613333555576616189656565201A116161333355656565897272201C222222616161727272728976201E727272727272767676767689五、程序代码冒泡法程序,适应于字节型数;bubblesortcodesegmentassumecs:codeorg0100hstart:jmpstart1buffdb12h,15h,46h,38h,89h,43h,27h,65h,19h,76h,55h,33h,61h,11h,22h,72h;0x1103contequ$-buff;设置循环长度start1:movbl,0movcx,cont;countmovsi,cxdecsideccxagain:moval,buff[si]cmpal,buff[si-1]jaenext;若前一个数大于后一个数,交换两数据位置xchgal,buff[si-1]movbuff[si],almovbl,1next:decsi;地址向后移动一个字节loopagaincmpbl,0;当数据不再变动,即BL=0,循环结束jnestart1nopcodeendsendstart六、程序调试过程程序调试中发现的问题:1、该程序循环次数较多,对分析程序功能产生困难2、适用于单字节型的冒泡法程序中唯有第六、第七遍扫描中出现了没有把最小数前置的错误问题,但在下一次扫描中更正了结果,因此并没有影响最终结果。3、字符型冒泡法程序改进实现在RAM区2000H一201FH中放入数据并将其按从小到大排序的程序为: