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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

微型计算机原理与接口技术

第一次实验报告

实验者姓名:

实验者学号:

所在班级:

报告完成日期:20年月日

实验二分支程序的设计

一、实验目的

1.学习提示信息的显示及键盘输入字符的方法。

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

二、实验内容

在提示信息下,从键盘输入原码表示的二位十六进制有符号数。当此数大于0时,屏幕显示此数为正数;当此数小于0时,屏幕显示此数为负数;当此数等于0时,屏幕显示此数为零。

三、实验调试过程

利用-u命令进行反汇编,结果如下。三个CMP语句运行完的地址如图所示,第一个CMP运行完的是29H

输出结果的地址如下图所示:

首先对输入为负数时进行验证:输入FFH,设置一个断点在29H,利用-t命令观察跳转,结果如图:

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

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

可以看到,程序最终正确的转入输出0的分支。

四、实验框图及程序代码

实验框图:

程序代码:

CRLF MACRO

MOV AH,02H

MOV DL,0DH

INT 21H

MOV AH,02H

MOV DL,0AH

INT 21H

ENDM

DA 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 ENDS

SSEG SEGMENT PARA STACK 'STACK'

DB 50 DUP(0)

SSEG ENDS

CODE SEGMENT

ASSUME CS:CODE,SS:SSEG,DS:DA TA

START:MOV AX,DATA

MOV DS,AX

MOV AX,SSEG

MOV SS,AX

MOV DX,OFFSET MESS1

MOV AH,09H

INT 21H

MOV AH,0AH

MOV DX,OFFSET DATABUF

INT 21H

CRLF

MOV AL,STRING

CMP AL,38H

JAE ISNEG

CMP AL,30H

JNZ ISPOS

MOV AL,[STRING+1]

CMP AL,30H

JNZ ISPOS

JMP ISZERO

ISPOS:MOV DX,OFFSET MESS2

MOV AH,09H

INT 21H

JMP DONE

ISNEG:MOV DX,OFFSET MESS3

MOV AH,09H

INT 21H

JMP DONE

ISZERO:MOV DX,OFFSET MESS4

MOV AH,09H

INT 21H

JMP DONE

DONE:MOV AX,4C00H

INT 21H

CODE ENDS

END 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查命令都更加了解!

相关文档
最新文档