汇编语言程序设计.docx
《汇编语言程序设计.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计.docx(13页珍藏版)》请在冰豆网上搜索。
![汇编语言程序设计.docx](https://file1.bdocx.com/fileroot1/2023-7/8/e79a0f3f-5455-422f-82c6-479ab4279d57/e79a0f3f-5455-422f-82c6-479ab4279d571.gif)
汇编语言程序设计
汇编语言程序设计
实验报告
实验名称
上机过程及顺序结构与分支结构程序设计实验
班级
学号
姓名
日期
2017年10月26号
成绩
评阅人
软件学院
一、实验目的与意义
理解并熟练掌握汇编语言程序设计过程中的编辑、汇编、链接和调试等各个步骤,提高对汇编课程内容的理解和汇编语言的掌握,通过上机练习加深对课程内容的理解和掌握。
通过汇编语言编制的程序上机调试、运行检验程序设计是否正确。
熟悉和掌握编辑、汇编、连接和调试四个实用程序的使用方法,掌握调试程序中的几个常用命令的使用方法。
熟悉其基本的指令操作,debug调试操作命令以及分支结构、顺序结构和循环结构的程序设计。
二、实验环境
操作系统:
MicrosoftWindows8
集成环境:
MasmforWindows
上机地点:
信息楼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,之后继续进行单步执行,知道程序的结束,此时程序执行完毕,执行结果如下:
之后,执行D0B3E:
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得到的运行结果为
实验三:
原始数据:
78H56H23H输出‘+’
E命令修改数据为:
-21H-13H-18H输出‘-’
E命令修改数据为:
-10H00H23H输出‘’
六、实验用程序清单(要有注释)
实验一:
DSEGSEGMENT;数据段开始
DATA1DB13H,26H;原始数据
DATA2DW0;保存结果单元
DSEGENDS;数据段结束
SSEGSEGMENTSTACK;堆栈段开始
SKTOPDB20DUP(0)
SSEGENDS;堆栈段结束
CSEGSEGMENT;代码段开始
ASSUMECS:
CSEG,DS:
DSEG
ASSUMESS:
SSEG
START:
MOVAX,DSEG;初始化数据端地址
MOVDS,AX
MOVAX,SSEG;初始化堆栈段地址
MOVSS,AX
MOVSP,LENGTHSKTOP;设置堆栈指针
MOVAL,DATA1;取第一个数据
ADDAL,DATA1+1;与第二个数据相加
MOVBYTEPTRDATA2,AL;保存结果
MOVAH,4CH
INT21H;返回DOS
CSEGENDS;代码段结束
ENDSTART;源程序结束
实验二
DSEGSEGMENT
DATA1DB30H,30H,30H,31H,30H,34H,30H,39H,31H,36H,32H,35H,33H,36H,34H,39H,36H,34H,38H,31H
DSEGENDS
SSEGSEGMENTSTACK
SKTOPDB00H
SSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
ASSUMESS:
SSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVAX,SSEG
MOVSS,AX
MOVAH,01H;从键盘录入一个数,将其ascall码存于AL
INT21H
SUBAL,30H;将acsall码减去30H获得该数大小存于AL
MOVBL,02H;BL赋值为02H
MULBL;AL乘以02H结果存在AX,表示该数平方的
MOVBP,AX;AX的值赋给BP
MOVDL,DS:
[BP];将十位数赋给DL
MOVAH,02H;输出十位数
INT21H;
MOVDL,DS:
[BP+1];将个位数赋给DL
MOVAH,02H;输出个位数
INT21H
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
实验三
DSEGSEGMENT
DATA1DB01H,-02H,03H
DSEGENDS
SSEGSEGMENTSTACK
SKTOPDB00H
SSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
ASSUMESS:
SSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVAX,SSEG
MOVSS,AX
XORBP,BP
MOVAH,DS:
[BP]
MOVAL,DS:
[BP+01H]
MOVBH,DS:
[BP+02H];三个数分别置于AHALBH中
CMPAH,AL;比较AHAL大小
JLMOVE1;若AH小于AL,跳跃到MOVE1
MOVBL,AH
MOVAH,AL
MOVAL,BL;AH与AL交换
MOVE1:
CMPAL,BH;比较AL与BH大小
JLMOVE2;若AL<=BH,跳跃到MOVE2
MOVBL,AL
MOVAL,BH
MOVBH,BL;AL与BH交换
MOVE2:
MOVBL,00H;BH赋值为0
CMPAH,BL;比较AH与0的大小
JLMOVE3;若AH<=0,跳跃到MOVE3
MOVDL,'+';若AH>0,则输出‘+’
MOVAH,02H
INT21H;
JMPMOVE5
MOVE3:
CMPBH,BL
JLMOVE4
MOVDL,''
MOVAH,02H
INT21H
JMPMOVE5
MOVE4:
MOVDL,'-'
MOVAH,02H
INT21H
MOVE5:
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
七、思考题(必需回答)写明如下问题
1.按照操作顺序写出上机操作的步骤;
(1)在编辑器中输入汇编语言程序,点击编译,查看有无语法类型的错误
(2)用link.exe链接
(3)链接完毕,用cmd/c运行程序,查看运行结果
(4)输入不同的数据多次运行并记录
(5)用debug命令在debug下运行
2.上机操作的步骤与顺序可以调整吗?
为什么?
不可以调整;因为如果调整了的话将无法正常进行上机操作
3.写出用DEBUG中的E命令修改内存单元内容的两种方法;
(1)EAddress;
(2)EAddress[list];
4.写出用DEBUG中的A命令修改指令的方法及应注意的问题;
命令的格式为:
AAddress
当执行A命令时,DEBUG等待用户输入指令序列。
输入每条指令后回车,再直接按回车键结束A命令。
DEBUG将输入指令序机的机器码存入指定地址开始的内存单元中。
需要注意的是A命令修改指令过程中默认输入的数值都为16进制,如果需要输入十进制数需要在数值后面加D或d
5.总结DEBUG中E、D、U命令的功能;
E命令用来设置指定内存单元的值
D命令用来显示内存单元的值
U命令用来将二进制代码反汇编为汇编语言的符号指令
6.总结DEBUG中P、G、T命令的功能;
继续命令P命令执行循环、重复的字符串指令、软件中断或子例程;
程序运行命令G命令用来执行指定范围地址的指令
跟踪命令T命令用来执行指定地址的指令
7.写出数据定义伪指令DB、DW和DD存储整数的格式;
DB:
在内存中用一个字节存储一个整数,由低地址至高地址依次存储;
DW:
在内存中用两个字节存储一个整数,高地址存高位,低地址存地位,由低地址至高地址依次存储;
DD:
在内存中用四个字节存储一个整数,高地址存高位,低地址存地位,由低地址至高地址依次存储。
8.同一个正数分别用DB、DW和DD定义,存储格式有何变化?
所占用的内存大小有变化,DB占用一个字节,DW占用两个字节,值在低地址,高地址用0填充,DD占用四个字节,值在低地址,高地址用0填充
9.同一个负数分别用DB、DW和DD定义,存储格式有何变化?
所占用的内存大小有变化,DB为一个字节,DW为两个字节,DD为三个字节,高地址存高位,低地址存地位,高位补F。
10.自定义标号分别用DW和DD定义,存储格式有何变化?
DW、DD分别两个一组、四个一组储存
11.DB、DW和DD在定义数据串时有何不同?
DB定义时每个值占用一个字节,DW定义时每个值占用两个字节,DD定义时每个值占用四个字节
12.说明十六进制数转换为ASCII码的方法;
将16进制数除以16,商与余数分别加上0的ASCII码,分别输出。
13.字符串(例如“Microsoft”)使用什么数据定义伪指令?
为什么?
用DB定义数据项为ASCII常数时,DB伪指令中可用引号括起任意多个(不超过一个逻辑行)字符
14.顺序结构的程序能有多个出口吗?
为什么?
不能。
一个顺序程序的出口是唯一确定的。
八、结束语
通过本实验加深了对汇编语言设计课程内容的理解和掌握,包括顺序结构与分支结构程序设计方法,以及编辑、汇编、连接和调试四个过程。
认识到学习汇编语言时一定要有缜密清晰的逻辑思维,要在不断的调试中清除错误最终完成程序。
九、参考文献
汇编语言程序设计及实验指导书
实验成绩
考查内容
分数
得分
做好实验内容的预习,写出预习报告
10
了解实验题目的调试方法
10
按实验要求预先设计好程序
10
认真记录实验数据并分析实验结果
10
实验后按要求书写实验报告,记录实验用数据及运行结果
30
创新能力强,在实验中设计的程序有一定的通用性,算法优化
20
实验过程中,具有严谨的学习态度,认真、踏实、一丝不苟的科学作风
10
成绩