当前位置:文档之家› 西安交通大学微机原理第一次实验报告

西安交通大学微机原理第一次实验报告

微型计算机原理与接口技术第一次实验报告实验者姓名:实验者学号:所在班级:报告完成日期:20年月日实验二分支程序的设计一、实验目的1.学习提示信息的显示及键盘输入字符的方法。

2.掌握分支程序的设计方法。

二、实验内容在提示信息下,从键盘输入原码表示的二位十六进制有符号数。

当此数大于0时,屏幕显示此数为正数;当此数小于0时,屏幕显示此数为负数;当此数等于0时,屏幕显示此数为零。

三、实验调试过程利用-u命令进行反汇编,结果如下。

三个CMP语句运行完的地址如图所示,第一个CMP运行完的是29H输出结果的地址如下图所示:首先对输入为负数时进行验证:输入FFH,设置一个断点在29H,利用-t命令观察跳转,结果如图:可以看到,程序最终正确的转入输出负的分支。

再输入正数11H,利用-t观察整个比较过程如下:可以看到,程序最终正确的转入输出正的分支。

最后输入00H,利用-t观察整个比较过程如下:可以看到,程序最终正确的转入输出0的分支。

四、实验框图及程序代码实验框图:程序代码:CRLF MACROMOV AH,02HMOV DL,0DHINT 21HMOV AH,02HMOV DL,0AHINT 21HENDMDA TA SEGMENT;定义结果信息MESS1 DB 'INPUT DATA:',0DH,0AH,'$'MESS2 DB 'THIS DATA IS+',0DH,0AH,'$'MESS3 DB 'THIS DATA IS-',0DH,0AH,'$'MESS4 DB 'THIS DATA IS ZERO',0DH,0AH,'$'DA TABUF DB 3 ;定义最大可输入字符长度ACTLEN DB ? ;实际输入字符长度STRING DB 3 DUP(?) ;输入字符缓冲区DA TA ENDSSSEG SEGMENT PARA STACK 'STACK'DB 50 DUP(0)SSEG ENDSCODE SEGMENTASSUME CS:CODE,SS:SSEG,DS:DA TASTART:MOV AX,DATAMOV DS,AXMOV AX,SSEGMOV SS,AXMOV DX,OFFSET MESS1MOV AH,09HINT 21HMOV AH,0AHMOV DX,OFFSET DATABUFINT 21HCRLFMOV AL,STRINGCMP AL,38HJAE ISNEGCMP AL,30HJNZ ISPOSMOV AL,[STRING+1]CMP AL,30HJNZ ISPOSJMP ISZEROISPOS:MOV DX,OFFSET MESS2MOV AH,09HINT 21HJMP DONEISNEG:MOV DX,OFFSET MESS3MOV AH,09HINT 21HJMP DONEISZERO:MOV DX,OFFSET MESS4MOV AH,09HINT 21HJMP DONEDONE:MOV AX,4C00HINT 21HCODE ENDSEND START五、实验结果及分析编写的汇编程序EX2.ASM经过汇编MASM与链接LINK生成可执行文件EX2.EXE,测试如下:可见,程序能够正确判断输入数据的正、负、零情况。

六、实验中遇到的问题及解决方法测试程序时,曾经输入0,结果输出“THIS DATA IS +”,出现错误。

后来查NG 发现是输入语句遇到换行即停止。

这样的输入方式导致第二位存的是换行符的ASCII码,导致结果出错!对程序开头的MACRO宏段的作用比较好奇,尝试在输入数据段将CRLF语句注释掉,发现数据输入后被下一句输出语句掩盖。

原来CRLF实现的是回车(换到行头)、换行(跳到下一行)。

七、思考题1.在DEBUG跟踪某条分支时,断点应该下在什么位置?如何查看标志位的变化情况?答:断点应该下在标志位或数值寄存器的值发生变化前后,比如这段程序就可以将断点设置在CMP语句的后一句语句之前,观察标志位的变化。

使用-r指令可以查看标志位的情况。

2.从键盘输入的数字在键盘缓冲区是怎么样分布的?用图简单地示意,用哪几条相关的DEBUG命令查看?答:调用NG查0AH功能号。

缓冲区第一字节存放它能够保存的最大字符数(即程序中的DATABUF),第二个字节存放实际输入的字符数(即程序中的ACTLEN),从第三字节开始存放键盘输入字符,最后一个字节将用来存放回车符。

所以,实际只能输入DATABUF-1个字符。

例如,对本次实验,输入的是两位16进制数,键盘缓存区如下:查看时,可以先用-u命令反汇编,找出缓冲区的偏移地址,利用-t、-p、-g等命令输入数据后,再用-d命令查看。

3.若输入的是非法字符而不是十六进制数,此程序会得到什么结果?如何改进?答:此程序只根据输入字符的ASCII码数值大小进行判断,因此若输入的非法字符高位大于或等于38H会显示为负,小于38H会显示为正。

改进时,需要增加判断语句,首先判断输入的数是否合法,即输入的数是否大于等于30H且小于等于39H或大于等于41H小于等于46H。

若不满足条件,直接跳转输出“输入数据不合法”;若满足条件,说明输入的数字合法,再按照原本的程序进行判断即可。

八、心得体会本次实验学习了汇编语言的分支程序设计,同时学习了键盘输入的相关知识。

以往学习C++语言时,输入可能只是一个cin或者scanf语句,没有关注过键盘输入的数据实际是怎样存储的。

这次实验才了解到输入的数据原来是这样存储,很有收获。

同时,以往简单的if语句,原来是背后的各种跳转指令实现的:这让我感受到,汇编语言比高级语言更加接近程序框图描述的方式,一个个箭头就是一个个Jxx的跳转指令,而判断语句块则对应着各种F标志位。

总之,本次实验让我在第一个顺序程序设计的基础上对汇编语言更加熟悉,对其程序编写、DEBUG调试、以及NG查命令都更加了解!实验三循环程序的设计一、实验目的1.掌握提示信息的使用方法和从键盘键入信息的用法;2.掌握循环程序的设计方法。

二、实验内容编写程序,从键盘分别键入两个字符串,进行比较,若相同,则显示“MATCH”,否则,显示“NO MATCH”。

三、实验调试过程首先利用-u命令进行反汇编,结果如下:第一个比较语句运行结束的地址为4DH,第一个断点设置为4DH,比较两个字符串的长度。

首先验证两个不同长度的字符串,输入两个不同长度的字符串在4DH断点处利用-t命令观察跳转情况:代码地址直接跳转至67H,即不匹配输出块,输出“NO MATCH”,程序运行正确。

之后对两个相同的字符串调试:第一次的比较不进行跳转,即长度相等。

在下次比较开始循环跳转,直到CL减为0之前都会进行循环。

CL为0,跳出循环判断为相等,显示“MATCH”。

而在两个不相同的两个字符串比较时,在比较不相等时会立即跳出循环,跳转至不匹配块,显示“NO MATCH”,程序调试完成。

四、实验框图及程序代码五、实验框图:程序代码:CRLF MACROMOV AH,02HMOV DL,0DHINT 21HMOV AH,02HMOV DL,0AHINT 21HENDMDA TA SEGMENTMESS1 DB 'INPUT STRING1:',0DH,0AH,'$'MESS2 DB 'INPUT STRING2:',0DH,0AH,'$'MESS3 DB 'NO MA TCH',0DH,0AH,'$'MESS4 DB 'MATCH',0DH,0AH,'$'MAXLEN1 DB 81 ;定义字符串1允许最大长度80(最后一位用来存enter)ACTLEN1 DB ? ;字符串1实际输入长度单元STRING1 DB 81 DUP(?) ;字符缓冲区MAXLEN2 DB 81 ;定义字符串1允许最大长度80(最后一位用来存enter)ACTLEN2 DB ? ;字符串1实际输入长度单元STRING2 DB 81 DUP(?) ;字符缓冲区DA TA ENDSSTACK SEGMENT PARA STACK 'STACK'STA DB 50 DUP(?)TOP EQU LENGTH STA ;原来堆栈段的段基址是在栈顶!STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AX ;数据段段寄存器赋值MOV ES,AX ;附加段段寄存器赋值?????MOV AX,STACKMOV SS,AX ;堆栈段段寄存器赋值MOV SP,TOPMOV AH,09HMOV DX,OFFSET MESS1 ;显示提示信息1INT 21HMOV AH,0AHMOV DX,OFFSET MAXLEN1 ;接收字符串1INT 21HCRLFMOV AH,09HMOV DX,OFFSET MESS2 ;显示提示信息2INT 21HMOV AH,0AHMOV DX,OFFSET MAXLEN2 ;接收字符串2INT 21HCRLF;自行编写部分MOV SI,OFFSET ACTLEN1MOV BX,OFFSET ACTLEN2MOV AL,[SI]CMP AL,[BX]JNZ NOMA ;长度不等,表明不匹配,直接跳转MOV CL,ALLOOPER: ;循环部分INC SIINC BXMOV AL,[SI]CMP AL,[BX]JNZ NOMADEC CL;CMP CX,00HJNZ LOOPERMOV AH,09HMOV DX,OFFSET MESS4INT 21H ;显示'MATCH'JMP DEND ;结束NOMA: MOV AH,09HMOV DX,OFFSET MESS3INT 21H ;显示'NO MA TCH'DEND: MOV AX,4C00HINT 21HCODE ENDSEND START六、实验结果及分析编写的汇编程序EX2.ASM经过汇编MASM与链接LINK生成可执行文件EX2.EXE,测试如下:可见,程序可以正确比较两字符串的异同。

七、实验中遇到的问题及解决方法实验中曾出现比较结果不正确的情况,经过调试,发现是给循环次数赋值时用了MOV CX,AL。

此时AL=[SI],由于CX为16位,AL为8位,程序自动将[SI]和[SI+1]赋给了CX,出现错误!另外,删去附加段段寄存器赋值语句MOV ES,AX,程序结果没有区别,该语句的意义不明。

相关主题