汇编语言程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编语言程序设计
实验报告
实验名称上机过程及顺序结构与分支结构程序设计实验班级
学号
姓名
日期2017年10月26号
成绩
评阅人
软件学院
一、实验目的与意义
理解并熟练掌握汇编语言程序设计过程中的编辑、汇编、链接和调试等各个步骤,提高对汇编课程内容的理解和汇编语言的掌握,通过上机练习加深对课程内容的理解和掌握。通过汇编语言编制的程序上机调试、运行检验程序设计是否正确。熟悉和掌握编辑、汇编、连接和调试四个实用程序的使用方法,掌握调试程序中的几个常用命令的使用方法。熟悉其基本的指令操作,debug调试操作命令以及分支结构、顺序结构和循环结构的程序设计。
二、实验环境
操作系统:Microsoft Windows8
集成环境:Masm for Windows
上机地点:信息楼B405教室
三、实验的预习内容
预习的主要内容:
1. 使用DEBUG命令的方法;
2. 熟悉掌握从理论上定义数据的类型(即DB,DW,DD,);
3. 分支结构和顺序结构的步骤以及相关的指令;
4. 常用的标志位状态及相应的作用;
实验思路:
在对题目进行分析后,分析出解题方法,并做出与实验思路相对应的程序框图。依照程序框图的内容输入相对应的代码,最终在调试代码后,发现并解决一系列的汇编语言错误。进一步优化算法。实验之前必须了解十进制、十六进制和ASCII码之间的转换。预习查表法相关命令,掌握顺序程序的结构,从键盘输入数据的命令及显示到屏幕上的命令。
实验一:
题目1:将程序编辑、汇编、连接并通过集成环境中的debug调试,观察运行结果;用E命令修改指定地址的数据,再用G命令执行程序查看变化,用A
命令将加法指令修改成减法指令,再将其编译运行,查看寄存器值变化的异同。
题目2:分别用DB、DW和DD数据段9H,0FAH,41H,27H,编译链接之后生成exe文件,再用debug的r命令找到数据段地址,用d命令指定数据段地址,观察汇编后在机器内部对应的存储情况。
实验二:
先设置数据段地址和堆栈段地址;设置堆栈段指针;读取一个字符然后存储在AL中;用BX来存储AL中字符对应的数值;将BX中的值作为偏移地址;并在数据段中查找对应字符串;最终输出结果结束程序。
实验三:
先初始化数据段地址与堆栈段地址;设置堆栈段指针;然后将数据段中的data1放入AL中;读取数据段中的data2并判断data2是否大于0;然后读取数
据段中的data3并判断data3是否大于0;最终通过不同数据情况判断应当输出空字符、字符“-”或字符“+”。
四、实验的步骤与调试方法
实验一:
按照要求编写代码,然后编译、连接、运行。使用E命令修改数据,G命令查看,D命令查看数据变化;使用A命令修改加法为减法,G命令查看,再用D 命令查看数据变化。
实验二:
编写代码运行后从键盘输入0-9其中一个数字,检验结果是否正确,多次运行并检测。
实验三:
编写代码运行后,检验结果正确性,Debug使用E命令修改数据,检验结果正确性。
遇到的问题及调试办法:
分支结构出错,判断之后指向错误导致结果错误。Debug使用P单步执行。
五、实验数据与实验结果
实验一:
程序一:执行的结果如下:
从中可以看出初始的值为13和26,之后继续进行单步执行,知道程序的结束,此时程序执行完毕,执行结果如下:
之后,执行D 0B3E:0002观察结果,得知此时的和为39,结果如下图:
之后,使用E命令,在E后加入数据地址,之后输入要修改的数据,将13改为3,将26改为5,并且使用了D命令观察数据是否更改,经验证数据已经进行了更改,结果如下图:
之后,使用G命令来继续执行程序,结果如下图:
之后使用D命令来显示结果得知结果为8,结果正确:
使用A命令来更改ADD为SUB,首先使用U命令来进行反汇编,找到ADD所在的地址,使用A命令,在A后面加上ADD的地址进行修改,如下图:
之后进行单步执行得到结果如下得到减法的结果为ED:
程序二:
经过debug的D命令显示,得到如下结果
经过和之前实验预先的猜测一致,这样进一步加深了我对汇编语言数据的存储的理解。
实验二:
输入3,5得到的运行结果为
实验三:
原始数据:78H 56H 23H 输出‘+’
E命令修改数据为:-21H -13H -18H 输出‘-’ E命令修改数据为:-10H 00H 23H 输出‘’
六、实验用程序清单(要有注释)
实验一:
DSEG SEGMENT ;数据段开始
DATA1 DB 13H,26H ;原始数据
DATA2 DW 0 ;保存结果单元
DSEG ENDS ;数据段结束
SSEG SEGMENT STACK ;堆栈段开始
SKTOP DB 20 DUP(0)
SSEG ENDS ;堆栈段结束
CSEG SEGMENT ;代码段开始
ASSUME CS:CSEG,DS:DSEG
ASSUME SS:SSEG
START: MOV AX,DSEG ;初始化数据端地址
MOV DS,AX
MOV AX,SSEG ;初始化堆栈段地址
MOV SS,AX
MOV SP,LENGTH SKTOP ;设置堆栈指针
MOV AL,DATA1 ;取第一个数据
ADD AL,DATA1+1 ;与第二个数据相加
MOV BYTE PTR DATA2,AL ;保存结果
MOV AH,4CH
INT 21H ;返回DOS
CSEG ENDS ;代码段结束
END START ;源程序结束
实验二
DSEG SEGMENT
DATA1 DB
30H,30H,30H,31H,30H,34H,30H,39H,31H,36H,32H,35H,33H,36H,34H,39H,3 6H,34H,38H,31H
DSEG ENDS
SSEG SEGMENT STACK
SKTOP DB 00H
SSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
ASSUME SS:SSEG
START: MOV AX,DSEG
MOV DS,AX
MOV AX,SSEG
MOV SS,AX
MOV AH,01H ;从键盘录入一个数,将其ascall码存于AL
INT 21H
SUB AL,30H ;将acsall码减去30H获得该数大小存于AL
MOV BL,02H ;BL赋值为02H
MUL BL ;AL乘以02H结果存在AX,表示该数平方的
MOV BP,AX ;AX的值赋给BP
MOV DL,DS:[BP] ;将十位数赋给DL
MOV AH,02H ;输出十位数
INT 21H ;
MOV DL,DS:[BP+1] ;将个位数赋给DL
MOV AH,02H ;输出个位数
INT 21H
MOV AH,4CH
INT 21H
CSEG ENDS
END START