资源描述:
《微机原理实验报告》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
华北电力大学科技学院实验报告课程名称:微机原理实验指导老师:郭军学生姓名:牛玺童班级:电气11k6学号:111904010415 实验一数据转换实验一、实验目的(1)初步掌握在PC机上建立、汇编、链接和运行8086/88汇编语言程序的过程。(2)通过对两个验证性试验的阅读、调试、掌握不同进制数及编码相互转换的程序设计方法。(3)完成程序设计题,加深对数码转换的理解,了解简单程序设计方法。二、实验内容1.十六进制数转换为ASCII码设二字节十六进制数存放于其实地址为3500H的内存单元中,把他们转换成ASCII码后,再分别存入起始地址为350A的四个内存单元中。从书上ASCII码表中可知十六进制数加30H即可得到0H~9H的ASCII码,而要得到AH~FH的ASCII码,则需再加7H。请根据所给流程图理清思路,总结出对应的若干要点。将流程图与参考程序相互。根据分析的结果将运行时内存的变化列写出来。学习并使用MASM或WAVE仿真软件分析程序运行过程中相关寄存器及相应内存的变化情况来验证自己的猜想,以巩固命令的学习,提高编程能力。-29- 1.1程序流程图-29- 1.2实验程序DATASSEGMENT;此处输入数据段代码DATASENDSSTACKSSEGMENT;此处输入堆栈段代码STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AX;此处输入代码段代码MOVCX,0004H;根据转换个数设定循环次数;(两字节十六进制数如6B2C对应有四个用十六进制表示的ASCII码表示,即四个字节)MOVDI,3500H;指向该两字节十六进制数起始地址,此时在调试窗口修改内存字节MOVDX,[DI];将地址3500H中的内容(6B2C)给DXA1:MOVAX,DX;第一次时DX=6B2C,;因为想顺序取C、2、6、B,所以需要一个中间变量ANDAX,000FH;取低四位,第一次取到C,CMPAL,0AH;判断AL属于0~9,还是A~FJBA2;如果是0~9,则跳转到A2ADDAL,07H;若属于A~F,再加上07H后也是再加上30H即得到转换。A2:ADDAL,30H;0~9的ASCII码对应的十六进制比其;本身(注意:亦是十六进制)大30HMOV[DI+0AH],AL;将转码后的C,即43H给350AINCDI;将DI指向下一字节,用于存储转码后的值,第一次自增后要存‘2’PUSHCX;功能是接下来要用到CX作为一个中间变量,;而刚才已经使用并且接下来还会用到CX的值,;也可以不用CX,用其他不用的寄存器或者直接立即数形式的。MOVCL,04H;若直接用立即数,可能不稳定,(原因不详)用一个中间变量。SHRDX,CL;右移四位,如第一次转码后,DX=6B2C,-29- ;为下一次取低四位的2做好前提,将0010b移到低四位POPCX;执行完后,CX又用于计数LOOPA1;每一次转码后,执行完此句后,CX的值都要变化,;分别是3,2,1,0;正好四次。MOVAH,4CHINT21HCODESENDSENDSTART1.3实验过程与心得1.3.1编程要点1.数据在内存空间中的存储情况要清晰;图1-1-2图1-1-3如上图所示图1-2为处理前的存储情况,通过调试中的内存修改来实现并检查,图1-3为最后期待的转码结果,通过查询内存来检查。2.基本功能的实现:分两种情况去转码。中间涉及到比较选择语句,可以通过标志位来理解学习JB的实现条件是由于标志位的变化。3.取与存两个“指针”的变化-29- (1)取时通过一个中间变量取经过右移四位后的低字节来依次选择C、2、B、6;使用软件时,看AX经过“ANDAX,000FH”后是否取到了这些数。(2)每一次转码后存储时将指针在存储空间305A不断移动。每次存储后,可查询内存。(3)每一次循环过后,CX都要变化,也可同时学习PUSH、POP功能。1.3.2软件使用简介1.WAVE软件它可以将内存的变化及寄存器的变化实时展示出来,红色数据是新变化的值。查找内存时可通过右键转到地址即可,但需要输入物理地址。如此时偏移地址为3500H,而通过观察DI赋值前一状态ds为20H,则通过计算可知在3700H输入2C,3701H输入6B即可,双击修改。可以与硬件连接做接口实验,但没有人机对话功能。在使用之前需要建立新项目。过程简介如下:选择8086仿真--右击模块文件--新建项目--假如已编ASM文件(最好一个文件夹中)--保存项目--全部编译--单步执行(F8)--观查内存变化。2.MASM软件它可以通过DEBUG调试窗口来进行观察,但需要有不同的命令输入去修改内存,查询内存,并且更新情况也不如WAVE直白,若有其他未考虑的某值变化,不宜观测。单步跟踪(“t”-29- )是先执行上一条语句,并显示执行后的状态,即显示上一语句执行后的状态。而末尾的命令语句还未执行。它不需要计算物理地址。如找3500H时,直接输入“dds:3500”即可查询。另外,标志位的查询尽管每次单步跟踪都显示,但是需要先记住各个符号代表的意思。修改内存较WAVE繁琐,需要输入e3500,然后会提示修改,但一次只能改一个字节的内容。其余命令可以在左侧DEBUG调试里双击在右侧得到。另外,状态的显示没有记录。MASM有人机对话功能,但在使用时,无法调试查看内存变化。过程简介:编程--保存(.asm)--编译成目标文件--生成可执行文件--DEBUG调试。1.3.3使用过程1.将二字节十六进制数存放于起始地址为3500H的内存单元中图1-1-4-29- 2.查看内存的变化--注意DX的变化图1-1-53.(1)注意AX的变化,已取低四位(2)标志位的变化:0CH比0AH大,NC表示CF=0,不执行JB后的命令,即继续执行+07H。图1-1-6-29- 4.(1)结合图1-7和1-8观察确定内存变化的时刻,了解调试指令t的运行情况;(2)DI的变化图1-1-7图1-1-8-29- 5.(1)结合图1-8和图1-9观察DX的变化;(2)在调试过程中发现AX有非预期的变化,而原先也是有的,只是没注意到。这个对于代码段的思路学习是没太大关系的。图1-1-96.(1)注意CX的变化;(2)标志位CF由NC变成了CY,判断为JB成立,执行A2图1-1-107.(1)存储顺序的检查,确定指针指在350B,即确定可以往后存储;-29- (2)压栈的变量(CX)变化时间,PUSH后并没有改变CX的值;图1-1-118.(1)出栈的变量(CX)变化,出栈后CX的值还原。(在这里才提到是因为第一次循环中CX都是0004H,看不出变化)(2)g命令的使用,它可以全部运行,方便查看最后的结果。因为至此关于编程的几个要点已全部明确。图1-1-129.(1)检查执行结果,存储结果与预期相符。-29- (2)检查CX是否为预期的0,应用跟踪执行指令(‘t’),发现g只是一个断点,用于显示验证。但内存已发生了改变。图1-1-1310.由于内存已变化,无法确定后续命令是否对内存产生效果,虽从内存上不知350C是否再一次得到赋值,但AX的变化也可知。但更改350D的值,观察350D的变化也可以明显确定,形成对比。图1-1-1311.通过图1-14和图1-15可知,LOOP指令CX的计数方式。-29- 图1-1-14图1-1-152.程序设计:将十进制的ASCII码转换为BCD设从键盘输入的五位十进制数的ASCII码存放在2000H起始的内存单元内。若输入的不是十进制数的ASCII码,则对应存放结果的单元内容为“FF”。完成相应程序的编制,进行调试并验证结果。-29- 2.1程序流程图2.2程序DATASSEGMENT;此处输入数据段代码DATASENDSSTACKSSEGMENT;此处输入堆栈段代码STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AX;此处输入代码段代码MOVCX,05hMOVBX,2000H;存十进制数的ASCII码的起始位置GET:MOVAH,01H;键入十进制数INT21H;moval,31hMOV[BX],AL;比较输入的所对应的ASCII码是否在0~9内CMPAL,30HJBerrorCMPAL,39HJAerrorJMPcrec;不经过errorerror:;不是十进制数时,将FFH存入对应内存。pushcxmovcx,0ffhMOV[BX+1000H],cxpopcxMOVDL,[BX+1000H];直接将FF做为ASCII码所对应的符号显示出来,用以检验MOVAH,02HINT21HJMPenddcrec:SUBAL,30H-29- ;如若属于0~9,则-30H即可得到对应的十进制数于内存中MOV[BX+1000H],AL;将每一次翻过来的值放到3000H,3001H...3004H中MOVDL,[BX+1000H];显示用以检查验证adddl,30hMOVAH,02HINT21Hendd:INCBXLOOPGET;这种显示是一次输入对应两个地方的存储并分别显示。MOVAH,4CHINT21HCODESENDSENDSTART-29-2.3程序运行结果若为0~9,则输入一个数显示一个数;若是除此之外的,则显示FFH做为ASCII所对应的字符,如图2-2所示。另外,这种演示的前提是确定显示语句是正确的。图2-2实验二数据处理实验-29- 一、实验目的(1)进一步掌握在PC机上建立、汇编、链接和运行8086/88汇编语言程序的过程。(2)通过阅读并调试数据处理的示例程序,完成程序设计题,掌握简单程序的结构。二、实验内容1.寻找最大数和最小数的程序设在内存缓冲区BUF+1单元开始,存放8个单字节数,其数据长度在BUF单元,要求找出最大数送MAX单元,最小输送MIN单元。假如第一个数是最大数,并送到MAX单元中,依次把余下的数送到MAX单元中,否则取下一个数,最后MAX单元中即为最大数。同理可求出最小数。1.1参考程序DATASSEGMENT;此处输入数据段代码ORG100H;定义偏移首地址,方便寻找内存BUFdb8,22,33,12,-1,-50,-32,97,127MAXdb?MINdb?DATASENDSSTACKSSEGMENT;此处输入堆栈段代码STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AX1.2实验流程图-29- ;此处输入代码段代码MOVCH,0MOVCL,BUF;存个数数DECCX;后面要循环比较七(8-1)次,先变成七MOVAL,BUF+1;拿出第一个数放到最大数和最小数中,用于比较和更新MOVMAX,AL;放到最大数MOVMIN,ALMOVBX,OFFSETBUF+2;拿第二个数与现有的最大最小值比较LAST:MOVAL,[BX];AL作为暂时存储的寄存器代表新来的要比较的值CMPAL,MAX;判断是否更大JGGREAT;若大(用于有符号比较),则跳转CMPAL,MIN;判断是否更小,也可将相等的情况视作小于,则可省去,直接跳转至LESS即可JLLESS;若小,也相应跳转JMPNEXT;若相等,则直接跳过GREAT:MOVMAX,AL;大数更新JMPNEXTLESS:MOVMIN,AL;小数更新NEXT:INCBX;BX取的是第二个数(用于排序)的地址,现在要指向下一个,即要判断下一个LOOPLAST;第一次循环后,执行此句前cx为7,然后自减,判断是否继续。;(第二个数已判断完);第七次循环后,执行此句前cx为1,然后自减,cx=0,结束。;(第八个数已判断完)此时,最大最小值已经放好MOVAH,4CHINT21HCODESENDSENDSTART1.程序设计1-29- 设在内存缓冲区BUF+1单元开始,存放若干个单字节数,其数据长度在BUF单元,要求在这些数据中查找某个特定数据,若有则把存放在该字符的地址送AX,否则把FF送入AX。完成相应程序的编制,进行调试并验证结果。2.1流程图2.2程序DATASSEGMENT;此处输入数据段代码BUFDB8,2,33,10110111B,-5,65,30H,45H,20HDATASENDSSTACKSSEGMENT;此处输入堆栈段代码STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AXMOVAX,0;将要查找的数存起来,可以是AX,也可以是其他变量。MOVBX,AXMOVSI,OFFSETBUF;取地址MOVCX,0;对整个CX清一下零MOVCL,[SI];数据个数A1:INCSI;指向第一个数CMPBL,[SI];是否是JECREC;是的话JMPERRORCREC:MOVAX,SI;将地址给AXJMPEND1;完成退出ERROR:LOOPA1;不是的话,继续比较,;八次比较后,不再执行,进入下一语句MOVAX,0FFHEND1:MOVAH,4CHINT21HCODESENDSENDSTART-29- 实验三排序程序设计一、实验目的通过阅读并调试示例程序,完成程序设计题,掌握循环程序设计的方法。二、实验内容1.数的排序在数据块BUF区存放10个无符号数,要求设计程序将这些数由小到大排序,排序后的数仍放在该区域中。1.1设计思想(1)从最后一个数据(或第一个数)开始,一次把相邻的两个数进行比较,即第N个数和第N-1个数比较,第N-1个数与第N-2个数比较等等;若第二个数大于第N个数则两者交换,否则不交换,直到N个数的相邻两个数都比较完为止。此时,N个数的最小数将被排在N个数的最前列。(2)对剩下的N-1个数重复上述步骤,找到N-1个数中的最小数。(3)重复第二步,直到N个数全部排好为止。(4)本程序的主体思想是冒泡法,通过从后往前每相邻两位的比较将最小数放到最前面,这样循环进行N-1回一定可以将N个数排好序。但为了提高效率,引进另一种方法,如若在某回循环中,每一次相邻两数都是理想顺序,既不需要互换,则可以终止循环。另外,注意有符号数和无符号数的比较命令。-29- 1.2实验流程图1.3实验参考程序DATASSEGMENTBUFDB6,23,41,24,-3,-45,12,2,98,43DATASENDSSTACKSSEGMENTSTACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AXmovSI,OFFSETBUF+0AH;指针指到末尾数据的后一个字MOVCX,0AH;设置第一次的比较次数以及总的循环回数MOVBL,0FFH;设定交换标志A1:CMPBL,0FFH;每回向左移动最小数后,检查标志是否有改变,即是否有调整JNZA4;若某回每两个相比都不存在交换,即该回每次都跳到A3,;最后返到A1,这时bl还是00,而没被赋为ff,即顺序已排好,则退出MOVBL,00H;起始设置,用以比较DECCX;记录回数;如第一次只需要比较9次;JZA4;最多比较9次就可以把顺序排好,第一次把最小的放在数据首位,;第二次相当于对9个数排序;直至第九次对两个数排序PUSHSIPUSHCX;保存cx现有的值用以记录回数;每回的比较次数也保留了下来,用以每回的使用A2:DECSI;用以使每回的第一次指针指到末尾;由于SI需要增加,即指针需要左移,-29- MOVAL,[SI];将高侧(接近尾侧)地址(1回是10)的内容暂时放在AL中DECSI;指向上一个地址(1回1次时是地址9)CMPAL,[SI];(1回1次10和9比较)JNCA3;10若不大于9,则不交换,直接进行该回下一次XCHGAL,[SI];若10更小,需交换,把9内的值给AL,AL即10内的值放地址9中MOV[SI+01H],AL;9的值给10MOVBL,0FFH;交换标志A3:INCSI;由于SI指到了9,又限于A2开始有decsi,故需要增到需处理位的下一位;;所以去掉“38”“29”更改“15”的0A-->09亦可LOOPA2;每回的循环次数POPCX;此时释放是因为记录回数POPSI;从尾端再次开始JMPA1;进行下一回的比较,A4:;最后跳出结果:一是回数够了能保证顺序调整好,另一个是为了提高效率。MOVAH,4CHINT21HCODESENDSENDSTART2.比较相等关系bufX、bufY和bufZ是3个有符号十六进制数,编写一个比较相等关系的程序:(1)如果这三个数都不相等,则显示0;(2)如果这三个数中有两个数相等,则显示1;(3)如果这三个数都相等,则显示2;-29- 2.1程序流程图2.2程序DATASSEGMENT;此处输入数据段代码ORG50hbufXdb?bufYdb?bufZdb?showdb"","$"show1db"pleaseinputthreekeys","$"show2db"theresultis","$"DATASENDSSTACKSSEGMENT;此处输入堆栈段代码STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AX;此处输入代码段代码;--------------------------------------------movah,09h;提醒输入movdx,offsetshow1int21hmovah,09hmovdx,offsetshowint21hmovah,01h;数据采集int21hmovbufX,al;--------------------------------------------movah,09hmovdx,offsetshow;blankint21hmovah,01hint21hmovbufY,al-29-;---------------------------------------------29- movah,09hmovdx,offsetshow;blankint21hmovah,01hint21hmovbufZ,almovah,09hmovdx,offsetshow2;remebertooutputint21h;-------------------------------------------MOVDL,30HMOVBL,bufXMOVCL,bufZCMPBL,bufYJNEA2INCDLA2:CMPBL,CLJNEA3INCDLCMPDL,32HJEEND1A3:CMPbufY,CLJNEEND1INCDLEND1:MOVAH,02HINT21HMOVAH,4CHINT21HCODESENDSENDSTART2.3程序结果1.三个数都不相等时图3-2-22.三个数有两个相等时图3-2-33.三个数都相等时图3-2-4-29--29- 实验四系统中断调用实验一、实验目的通过阅读并调试示例程序,完成程序设计题,掌握利用DOS中断的调用来实现人机对话的编程方法。二、实验内容1.人机会话程序通过人机会话可以获取程序运行所需要的数据,本程序应用的DOS中断功能,涉及到了1、2、9、0AH四个功能的调用。1.1设计思路首先计算机询问用户姓名,等到用户输入姓名的汉语拼音,然后将它显示在屏幕上,请用户认可,用户键入“Y”程序结束,否则再次询问用户姓名。1.2实验流程图1.3实验参考程序DATASSEGMENT;此处输入数据段代码MESG1DB0DH,0AH,'Whatisyourname?$'MESG2DB'?(Y/N)$'BUFDB30;大接收字节数DB?;输入的总字节数DB30DUP(?);从这开始存要输入的数据DATASENDSSTACKSSEGMENT;此处输入堆栈段代码STACKSENDSCODESSEGMENT-29- ASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AX;此处输入代码段代码AGAIN:MOVAH,9MOVDX,OFFSETMESG1INT21HMOVAH,0aHMOVDX,OFFSETBUF;WHYNOT+2?这样就指到了这个内存单元INT21HMOVBL,BUF+1;WHY+1?10号功能的属性:1.首单元存最大接收字节数,;2.下一单元存输入的总字节数,3.再后面是稍后要存入的数据MOVBH,0MOVSI,OFFSETBUF+2MOVBYTEPTR[BX+SI],'$';用于显示名字(刚才输入的)时作为结尾结束标识符MOVAH,2MOVDL,0AHINT21HMOVAH,9MOVDX,OFFSETBUF+2INT21HMOVAH,9MOVDX,OFFSETMESG2INT21HMOVAH,1INT21HCMPAL,'Y'JNZAGAINMOVAH,4CHINT21HCODESENDSENDSTART-29-1.4程序结果图4-1-22.程序设计编写一个源程序,在键盘上按一个键,将从AL返回的ASCII码显示出来,如果按下ESC键则程序退出。请调用书中的HTOASC子程序。-29- 2.1程序流程图2.2程序-29-DATASSEGMENT;此处输入数据段代码DATASENDSSTACKSSEGMENT;此处输入堆栈段代码STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AX;此处输入代码段代码MOVAH,01HINT21H;键入CMPAL,1BHJEEND1;若是ESC,则退出;------------------------------------29- ;假设输入a,则对应的ASCII码为61(ASCII码范围00~7F),;而这个61已存在了AL中,分别取其高低各四位然后显示出来即可,;即对0~F转换成ASCII码即可,见子程序HTOASC;-----------------------------------PUSHAX;取高四位MOVCL,04HSHRAL,CL;右移四位才可将高四位当作一个数取到AL中CALLHTOASC;调用转码显示,也实现了先显示高位POPAXPUSHAX;取低四位ANDAL,0FH;与运算取到低位CALLHTOASCPOPAXEND1:MOVAH,4CHINT21HHTOASCPROCCMPAL,39HJBEHTOASC1;ASCII码范围00~7F,只要判断是否比‘9’大即可ADDAL,07HHTOASC1:ADDAL,30HMOVDL,AL;入口参数MOVAH,02H;单个字符显示INT21H;调用DOS中断RETHTOASCENDPCODESENDSENDSTART-29-2.3结果1.4的ASCII码是34H图4-2-22.输入‘ESC’时图4-2-3-29- 实验五存储器扩展及读写实验一、实验目的(1)通过阅读并调试示例程序,完成程序设计题,熟悉静态RAM的扩展方法。(2)了解8085/8088与存储器的连接,掌握扩展存储器的读写方法。二、实验内容1.实验原理(62256RAM介绍)62556是32K*8的静态存储器,管脚如图5-1所示。其中A0~A14为地址线,DB0~DB7为数据线,/CS为存储器的片选,/OE为存储器数据输出选通信号,/WE为数据写入存储器信号。62256工作方式如表5-1所示。表5-162256工作方式/CS/WE/OE方式DB0~DB7HXX未选中高阻LHH读写禁止高阻LLH写INLHL读OUT1.实验内容设计扩展存储器电路的硬件连接图并编制程序,将自负A~Z循环存入62256扩展RAM中,然后再检查扩展存储器中的内容。-29- 1.硬件设计参考硬件设计参考电路如图5-2所示。2.编程提示按上述电路接线,62256RAM只使用了4KB空间,设扩展存储器地址空间范围为0000:8000H~0000:8FFFH。6.程序-29-RAMADDREQU0000HRAMOFFEQU8000HCOUNTEQU1000H;充满2^12个地址(4KB),每个地址放一个字节;(一个ASCII码占一个字节)。CODESEGMENTASSUMECS:CODESTART:DPCHPROCNEAR;注意形式MOVAX,RAMADDRMOVDS,AX;取逻辑地址MOVBX,RAMOFF;取偏移地址MOVCX,COUNT;总个数MOVDL,40H;因为后面需要自增,;(\)也可将自增改放到LOOP前面,去掉该句REP1:INCDLMOV[BX],DLINCBX;每次存储后,偏移地址自增CMPDL,5AHJNZSS1;若不是'Z',则跳转继续,MOVDL,40H;等是'Z'时,已将'Z'存入,然后再指向40H;(\)这种情况下,也是如此。SS1:LOOPREP1;每一次存储过后都自减,共1000H个JMP$;结束标志DPCHENDPCODEENDSENDSTART-29-7.程序设计7.1如扩展存储器的地址为0000:9000~0000:9FFFH,地址总线和片选信号如何连接?试设计并画出该电路。RAMADDREQU0000H-29- RAMOFFEQU9000HCOUNTEQU1000HCODESEGMENTASSUMECS:CODESTART:DPCHPROCNEARMOVAX,RAMADDRMOVDS,AXMOVBX,RAMOFFMOVCX,COUNTMOVDL,40HREP1:INCDLMOV[BX],DLINCBXCMPDL,5AHJNZSS1MOVDL,40HSS1:LOOPREP1JMP$DPCHENDPCODEENDSENDSTART7.2编写程序,将4KB扩展存储器交替写入55H和AAH。完成程序的编制,进行调试并验证结果。-29-RAMADDREQU0000HRAMOFFEQU8000HCOUNTEQU1000H;也可设为800H,将后面的右移去掉CODESEGMENTASSUMECS:CODESTART:DPCHPROCNEARMOVAX,RAMADDR;段地址MOVDS,AXMOVBX,RAMOFF;偏移地址MOVCX,COUNTSHRCX,01H;由于一次循环存入一个字,故除二REP1:MOV[BX],55HINCBXMOV[BX],0AAHINCBXLOOPREP1JMP$-29- DPCHENDPCODEENDSENDSTART-29-