您好,欢迎访问三七文档
中南大学课题名称:微机原理与接口技术课程实验报告学院:信息科学与工程学院班级:通信工程学号:姓名:指导老师:梁建武DEBUG实验一、实验内容与要求DEBUG各命令熟悉,调试,运行。二、实验步骤debug是DOS下使用的程序,我们在进入debug前,应先进入DOS方式。在windows中进入DOS方式,此时进入的是虚拟8086模式的DOS。首先,打开命令提示符,或在运行界面下输入cmd,打开命令窗口。键入debug,如下图所示:(1)进入DEBUG调试界面后,键入A,执行汇编命令:(2)输入命令:MOVAX,1000;要实现将AX中内容与BX中内容进行交换MOVBX,2000PUSHAXPUSHBXPOPAXPOPBX输入命令后,回车,敲入T(单步运行):每输入一次T后,都会向后单步运行(T=偏移地址,表示从此开始单步):(3)键入‘U偏移地址’,执行反汇编命令,显示原先指令输入‘U0100’,表示从偏移地址0100处开始执行反汇编命令:(4)R,是寄存器命令,显示寄存器的所有内容;键入‘R寄存器’可修改寄存器的内容,如键入‘RAX’,可修改AX内的内容:用R指令,还可以得到右下角的信息:NVUPEIPLNZNAPONC这些符号代表的就是标志寄存器里常用标志位的值。符号值对应表:溢出标志OF(Overflowflag)OV(1)NV(0)方向标志DF(Directionflag)DN(1)UP(0)中断标志IF(Interruptflag)EI(1)DI(0)符号标志SF(Signflag)NG(1)PL(0)零标志ZF(Zeroflag)ZR(1)NZ(0)辅助标志AF(Auxiliarycarryflag)AC(1)NA(0)奇偶标志PF(Parityflag)PE(1)PO(0)进位标志CF(Carryflag)CY(1)NC(0)(5)D,显示内存命令;(6)键入‘D偏移地址’,表示从该地址开始显示内存:(7)E,表示修改内存。键入‘E偏移地址’表示修改该偏移地址对应的内存:(8)XCHG命令,实现字节、字交换,寄存器之间交换,寄存器与存储器之间交换;输入代码:MOVAX,1234HXCHGBX,AX;将BX与AX内的内容交换(9)ADD加法指令,不带进位MOVAL,10HADDAL,20H;AL←AL+20HMOVBX,D75FHADDBX,8046H;此时标志位也发生了变化结果:CF=1ZF=0PF=0AF=1OF=1SF=0.(10)加1指令INCINCAL;AL←AL+1(11)不考虑借位的减法指令SUBSUBAH,0F0H;AH←AH-0F0H(12)考虑借位的减法指令SBBMOVAX,5678HMOVDX,1234HSUBAX,6789H;CF=1SBBDX,1122H;DX=0111H(13)减1指令DECDECCX;CX←CX-1(14)比较指令CMP,相减后的差值不送回目的操作数,只反应在标志位上;CMPAL,0AH;AL的值原为EEEFH,执行语句后,辅助标志位AF=0,奇偶标志位PF=0CMPAL,FFH;执行语句后,辅助标志位AF=0,进位标志CF=1(15)逻辑与指令ANDANDAL,10010011(要转换成十六进制)键入‘ANDAL,93’,实现将AL中的第0、1、4、7位保留,其他位清零。(16)逻辑或指令OR键入‘ORBL,0F0H’,将BL的高4位置1,其他位不变(17)逻辑异或指令XOR键入‘XORAL,0FFH’,将AL的8位全部取反,其他不变三、实验出现问题与解决(1)实验过程中,要注意的是,在DEBUG中,默认是十六进制,所以数字后面不需要再加上‘H’,abcd前也不用再加0,否则会出错。(2)程序不可以往回翻看,要记得保留数据。(3)程序运行过程中出错以后,开始时,出现了与预期不一样的结果,后来了解到,程序是在error后开始运行的。四、DEBUG实验心得与体会第一次接触的时候会有些陌生,但是通过实验,对于DEBUG调试有了初步的了解,也进行了一些初步的运用调试。看到实验结果的第一反应就是觉得很复杂,但是仔细地去想去理解每个结果,其实都是有理可循的,甚至到后面,我可以通过自己的判断来预测出现的结果,然后进行实际的操作,将实际得到的结果与我之前预测的结果进行比较,及时找到自己的漏洞,得到更好的理解。汇编实验一、实验要求汇编语言设计(自选3个程序设计,学会调试,尤其要单步调试)二、实验内容与步骤(1)、通过查表,实现一位0~9十进制数转换为对应格雷码显示。代码如下:;DATASEGMENT;数据段内容,在数据段写下面两行即可TABDB18H,34H,05H,06H,09H,0AH,0CH,11H,12H,14H;定义一个表NUMDB05H,08H;定义两个数;DATAENDS;代码段;MOVAX,DATA;MOVDS,AX;代码段添加内容如下:MOVBX,OFFSETTAB;BX指向TAB表MOVAL,NUM;AL取得一位16进制数05H,即TAB表中的位移ANDAL,0FH;低4位有效,高4位清零XLAT;AL←DS:[BX+AL],为0AHMOVDL,AL;DOS功能调用,显示格雷码,显示ASCII码MOVAH,2INT21H;显示0AH的ASCII码值MOVAL,NUM+1;;AL取得一位16进制数08HANDAL,0FHXLATMOVDL,ALMOVAH,2INT21H;显示12H的ASCII码值实验步骤与截图如下:1、首先将代码分别填入数据段和代码段相应位置:2、点击COMPILEANDEMULATE后,弹出窗口:3、点击“SingleStep”或按下F8,进行单步运行。运行完代码段第一句MOVBXOFFSETTAB后:4、继续单步运行。运行了MOVAL,NUM后,将05H给了AL,可以看见左边寄存器列表中,AL的值由67变为了05:5、执行XLAT换码指令后:AL←DS::[BX+AL],为0AH,可见将TAB表中位移为05H的0AH给了AL:6.执行完DOS功能调用,显示格雷码后,输出0AH对应换行符(由于换行符在显示屏上不能显示出来,所以看见的是黑屏):7、一直进行单步运行。接着将08H像05H一样进行处理。执行完第二个XLAT换码指令后,可以看到,在显示屏上,显示出了对应于12H的字符:8、运行结束时出现窗口:(2)、在存储单元DATA中存放着1位十六进制数,将其显示到屏幕上。代码如下:;数据段DATASEGMENTDATADB0CH;定义存储单元DATADATAENDS;代码段CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;本实验中代码添加部分:MOVAL,DATA;将DATA放入ALCMPAL,9;将AL中DATA与9比较JGNEXT;如果DATA大于9,跳转至NEXTADDAL,30H;如果DATA小于9,加上30H转换为数字0~9JMPDISPNEXT:ADDAL,37H;如果大于10,则转换为大写字母A~FDISP:MOVDL,AL;调用DOS指令,显示输出,DL=显示输出字符MOVAH,2INT21HDONE:MOVAH,4CH;调用终止命令INT21H实验步骤及截图如下:1、首先将代码分别添加至数据段和代码段的相应位置:1、进行单步运行。2、执行MOVAX,DSEG(MOVAX,DATA)后,将数据段首地址0B67H赋给了AX:4、执行到代码段后,将存储单元DATA内的内容0CH赋给了AL:5、执行了JGNEXT的语句后,程序将AL的内容0CH与9进行比较,因为0CH大于9,所以跳转到了NEXT,执行后续的语句ADDAL,30HJMPDISP6、最后执行完DOS功能调用后,显示结果到屏幕上,可以看见屏幕上出现的是大写字母C(因为0CH+37H=43H,即为大写字母C):(3)、从键盘输入一个字符串,将其中的小写字母转换为大写字母,然后显示。该程序的执行,首先要判断输入小写字母(ASCII码61H~7AH),如果是,则转换为大写字母(ASCII码41H~5AH)。代码如下:;数据段DATASEGMENTKEYNUMEQU255;这里的=要用EQU代替,否则会出错,因为每一个编译系统不一样KEYBUFDBKEYNUMDB0DBKEYNUMDUP(0)DATAENDS;代码段CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVDX,OFFSETKEYBUFMOVAH,0AH;用DOS的功能号调用,输入一个字符串INT21H;回车符结束MOVDL,0AH;换行,用来在下一行显示转换后的字符串MOVAH,2INT21HMOVBX,OFFSETKEYBUF+1;取出字符串中的字符个数MOVCL,[BX]MOVCH,0;作为循环的次数AGAIN:INCBXMOVDL,[BX];取出一个字符CMPDL,’a’;小于小写字母a,不需要处理JBDISPCMPDL,’z’;大于小写字母z,不需要处理JADISPSUBDL,20H;小写字母,转换为大写字母DISP:MOVAH,2;显示一个字符INT21HLOOPAGAIN;循环处理,直到整个字符串处理完CODEENDSENDSTART实验步骤和截图如下:1、首先将数据段和代码段的数据分别添加到相应的位置:2、执行单步运行。3、将KEYBUF偏移地址赋给DX,DX内存显示为0000,故KEYBUF偏移地址为0:4、用DOS的0AH号功能调用,输入一个字符,回车符结束,弹出窗口,输入‘abcde’,敲入回车结束:5、执行语句MOVDX,OFFSETKEYBUFMOVAH,0AHINT21H后,换行,用来在下一行显示转换后的字符串,DL=显示输出字符:6、执行语句MOVBX,OFFSETKEYBUF+1MOVCL,[BX]MOVCH,0后,取KEYBUF的偏移地址加1,此时BX里是输入字符的个数,将字符串中的字符个数赋给CL,0赋给CH,作为循环的次数。7、接下来,继续执行AGAIN内的INCBX语句,取出一个字符,若小于小写字母a或大于小写字母z,不需要处理,否则,SUBDI20H将小写字母转换为大写字母。8、执行DISP,显示一个转换后的字符:9、然后,进行循环处理,直到整个字符串都处理完,得到转换后的字符串“ABCDE”:四、实验出现问题与解决1.在实验中,最初感觉到书本上与该应用有一些不一样的地方,在EXE文件中,有的语句已经给出,所以如果继续打上去,就会报错。2.做程序(1)时,第一个换码指令后,显示的结果是黑屏,什么都看不见,后来通过查询ASCII码表后发现,输出0AH对应换行符,由于换行符在显示屏上不能显示出来,所以看见的是黑屏。3.进行程序(3)时,一开始照着书本上的程序语句时KEYNUM=255,结果报错,原来是因为不同系统的原因,这里需要将=号改为EQU。4.关于程序(3)最后出现的结果问题,我发现最后转换成大写字母后结果的显示,在第二行对应上面输入字符后的位置进行输出,所以我觉得有点奇怪,于是我过去询问了老师。在老师的指导下,我发现我的问题再与对换行符和回车符的混淆。如果将程序中的换行符显示,改为回车符显示,我发现,结果输出将从第一行的最左边开始覆盖了输入的内容进行输出。而换行符则是只换行,不回到最左端。五、汇编实验心得与体会这次实验是在emu8086compilerandemulator的平台上进行的操作。从之前自己做的实例和本次实验中,我深深觉得这样做程序,通过单步运行,看到内存,寄存器等的结果显示,是一件非常有意思的事情。一旦熟悉了操作以后,实践起来就非常便捷了。尤其是当自己先认真去理解程序代码的意图,然后预测应当出现的结果,直到用程序去调试实际的结果,最后进行比对的过程,会让人学习到不少的东西。感触比较深的还有单步运行这个操作,每一步执行以后都可以看到相应的结果变化,很直观,也更容易让人理解。以后,应该还会有很多这样实验的机会,很值得去尝试。接口实验实验一使用ADC0809的A/D转换
本文标题:微机实验报告
链接地址:https://www.777doc.com/doc-2435741 .html