1、汇编语言程序设计汇编语言程序设计实验报告 实验名称上机过程及顺序结构与分支结构程序设计实验班 级学 号姓 名日 期2017年10月26号成 绩评 阅 人 软件学院一、实验目的与意义理解并熟练掌握汇编语言程序设计过程中的编辑、汇编、链接和调试等各个步骤,提高对汇编课程内容的理解和汇编语言的掌握,通过上机练习加深对课程内容的理解和掌握。通过汇编语言编制的程序上机调试、运行检验程序设计是否正确。熟悉和掌握编辑、汇编、连接和调试四个实用程序的使用方法,掌握调试程序中的几个常用命令的使用方法。熟悉其基本的指令操作,debug调试操作命令以及分支结构、顺序结构和循环结构的程序设计。二、实验环境操作系统:M
2、icrosoft Windows8集成环境:Masm for Windows上机地点:信息楼B405教室三、实验的预习内容预习的主要内容:1. 使用DEBUG命令的方法;2. 熟悉掌握从理论上定义数据的类型(即DB,DW,DD,);3. 分支结构和顺序结构的步骤以及相关的指令;4. 常用的标志位状态及相应的作用;实验思路:在对题目进行分析后,分析出解题方法,并做出与实验思路相对应的程序框图。依照程序框图的内容输入相对应的代码,最终在调试代码后,发现并解决一系列的汇编语言错误。进一步优化算法。实验之前必须了解十进制、十六进制和ASCII码之间的转换。预习查表法相关命令,掌握顺序程序的结构,从键盘
3、输入数据的命令及显示到屏幕上的命令。实验一:题目1:将程序编辑、汇编、连接并通过集成环境中的debug调试,观察运行结果;用E命令修改指定地址的数据,再用G命令执行程序查看变化,用A命令将加法指令修改成减法指令,再将其编译运行,查看寄存器值变化的异同。题目2:分别用DB、DW和DD数据段9H,0FAH,41H,27H,编译链接之后生成exe文件,再用debug的r命令找到数据段地址,用d命令指定数据段地址,观察汇编后在机器内部对应的存储情况。实验二:先设置数据段地址和堆栈段地址;设置堆栈段指针;读取一个字符然后存储在AL中;用BX来存储AL中字符对应的数值;将BX中的值作为偏移地址;并在数据段
4、中查找对应字符串;最终输出结果结束程序。实验三:先初始化数据段地址与堆栈段地址;设置堆栈段指针;然后将数据段中的data1放入AL中;读取数据段中的data2并判断data2是否大于0;然后读取数据段中的data3并判断data3是否大于0;最终通过不同数据情况判断应当输出空字符、字符“-”或字符“+”。四、实验的步骤与调试方法实验一:按照要求编写代码,然后编译、连接、运行。使用E命令修改数据,G命令查看,D命令查看数据变化;使用A命令修改加法为减法,G命令查看,再用D命令查看数据变化。实验二:编写代码运行后从键盘输入0-9其中一个数字,检验结果是否正确,多次运行并检测。实验三:编写代码运行后
5、,检验结果正确性,Debug使用E命令修改数据,检验结果正确性。遇到的问题及调试办法:分支结构出错,判断之后指向错误导致结果错误。Debug使用P单步执行。五、实验数据与实验结果实验一:程序一:执行的结果如下:从中可以看出初始的值为13和26,之后继续进行单步执行,知道程序的结束,此时程序执行完毕,执行结果如下:之后,执行D 0B3E:0002观察结果,得知此时的和为39,结果如下图:之后,使用E命令,在E后加入数据地址,之后输入要修改的数据,将13改为3,将26改为5,并且使用了D命令观察数据是否更改,经验证数据已经进行了更改,结果如下图:之后,使用G命令来继续执行程序,结果如下图:之后使用
6、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
7、 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:SSEGSTART: MOV AX,DSEG ;初始化数据端地址 MOV DS,AX MOV AX,SSEG ;初始化堆栈段地址 MOV SS,AX MOV SP,LENGTH SKTOP ;设置堆栈指针 MOV AL,DATA1 ;
8、取第一个数据 ADD AL,DATA1+1 ;与第二个数据相加 MOV BYTE PTR DATA2,AL ;保存结果 MOV AH,4CH INT 21H ;返回DOSCSEG ENDS ;代码段结束 END START ;源程序结束实验二DSEG SEGMENTDATA1 DB 30H,30H,30H,31H,30H,34H,30H,39H,31H,36H,32H,35H,33H,36H,34H,39H,36H,34H,38H,31HDSEG ENDS SSEG SEGMENT STACKSKTOP DB 00HSSEG ENDSCSEG SEGMENT ASSUME CS:CSEG,DS
9、:DSEG ASSUME SS:SSEGSTART: 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
10、 AH,02H ;输出个位数 INT 21H MOV AH,4CH INT 21HCSEG ENDS END START实验三DSEG SEGMENTDATA1 DB 01H,-02H,03HDSEG ENDS SSEG SEGMENT STACKSKTOP DB 00HSSEG ENDSCSEG SEGMENT ASSUME CS:CSEG,DS:DSEG ASSUME SS:SSEGSTART: MOV AX,DSEG MOV DS,AX MOV AX,SSEG MOV SS,AX XOR BP,BP MOV AH,DS:BP MOV AL,DS:BP+01H MOV BH,DS:BP+0
11、2H ;三个数分别置于AH AL BH中 CMP AH,AL ;比较AH AL大小 JL MOVE1 ;若AH小于AL,跳跃到MOVE1 MOV BL,AH MOV AH,AL MOV AL,BL ;AH与AL交换MOVE1: CMP AL,BH ;比较AL与BH大小 JL MOVE2 ;若AL=BH,跳跃到MOVE2 MOV BL,AL MOV AL,BH MOV BH,BL ;AL与BH交换MOVE2: MOV BL,00H ;BH赋值为0 CMP AH,BL ;比较AH与0的大小 JL MOVE3 ;若AH0,则输出+ MOV AH,02H INT 21H ; JMP MOVE5MOVE
12、3: CMP BH,BL JL MOVE4 MOV DL, MOV AH,02H INT 21H JMP MOVE5MOVE4: MOV DL,- MOV AH,02H INT 21HMOVE5: MOV AH,4CH INT 21HCSEG ENDS END START七、思考题(必需回答)写明如下问题1.按照操作顺序写出上机操作的步骤;(1)在编辑器中输入汇编语言程序,点击编译,查看有无语法类型的错误(2)用link.exe链接(3)链接完毕,用cmd/c运行程序,查看运行结果(4)输入不同的数据多次运行并记录(5)用debug命令在debug下运行2.上机操作的步骤与顺序可以调整吗?为什
13、么?不可以调整;因为如果调整了的话将无法正常进行上机操作3.写出用DEBUG中的E命令修改内存单元内容的两种方法;(1)E Address;(2)E Address list;4.写出用DEBUG中的A命令修改指令的方法及应注意的问题;命令的格式为:A Address当执行A命令时,DEBUG等待用户输入指令序列。输入每条指令后回车,再直接按回车键结束A命令。DEBUG将输入指令序机的机器码存入指定地址开始的内存单元中。需要注意的是A命令修改指令过程中默认输入的数值都为16进制,如果需要输入十进制数需要在数值后面加D或d5.总结DEBUG中E、D、U命令的功能;E 命令用来设置指定内存单元的值
14、D命令用来显示内存单元的值U命令用来将二进制代码反汇编为汇编语言的符号指令6.总结DEBUG中P、G、T命令的功能;继续命令P命令执行循环、重复的字符串指令、软件中断或子例程;程序运行命令G命令用来执行指定范围地址的指令跟踪命令T命令用来执行指定地址的指令7.写出数据定义伪指令DB、DW和DD存储整数的格式;DB:在内存中用一个字节存储一个整数,由低地址至高地址依次存储;DW:在内存中用两个字节存储一个整数,高地址存高位,低地址存地位,由低地址至高地址依次存储;DD:在内存中用四个字节存储一个整数,高地址存高位,低地址存地位,由低地址至高地址依次存储。8.同一个正数分别用DB、DW和DD定义,
15、存储格式有何变化?所占用的内存大小有变化,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、制数除以16,商与余数分别加上0的ASCII码,分别输出。13.字符串(例如“Microsoft”)使用什么数据定义伪指令?为什么?用DB定义数据项为ASCII常数时,DB伪指令中可用引号括起任意多个(不超过一个逻辑行)字符14.顺序结构的程序能有多个出口吗?为什么?不能。一个顺序程序的出口是唯一确定的。八、结束语通过本实验加深了对汇编语言设计课程内容的理解和掌握,包括顺序结构与分支结构程序设计方法,以及编辑、汇编、连接和调试四个过程。认识到学习汇编语言时一定要有缜密清晰的逻辑思维,要在不断的调试中清除错误最终完成程序。九、参考文献汇编语言程序设计及实验指导书实验成绩考查内容分数得分做好实验内容的预习,写出预习报告10了解实验题目的调试方法10按实验要求预先设计好程序10认真记录实验数据并分析实验结果10实验后按要求书写实验报告,记录实验用数据及运行结果30创新能力强,在实验中设计的程序有一定的通用性,算法优化20实验过程中,具有严谨的学习态度,认真、踏实、一丝不苟的科学作风10成 绩
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1