当前位置:文档之家› 汇编语言程序设计

汇编语言程序设计

汇编语言程序设计实验报告实验名称上机过程及顺序结构与分支结构程序设计实验班级学号姓名日期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:DSEGASSUME SS:SSEGSTART: MOV AX,DSEG ;初始化数据端地址MOV DS,AXMOV AX,SSEG ;初始化堆栈段地址MOV SS,AXMOV SP,LENGTH SKTOP ;设置堆栈指针MOV AL,DATA1 ;取第一个数据ADD AL,DATA1+1 ;与第二个数据相加MOV BYTE PTR DATA2,AL ;保存结果MOV AH,4CHINT 21H ;返回DOSCSEG ENDS ;代码段结束END START ;源程序结束实验二DSEG SEGMENTDATA1 DB30H,30H,30H,31H,30H,34H,30H,39H,31H,36H,32H,35H,33H,36H,34H,39H,3 6H,34H,38H,31HDSEG ENDSSSEG SEGMENT STACKSKTOP DB 00HSSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEGASSUME SS:SSEGSTART: MOV AX,DSEGMOV DS,AXMOV AX,SSEGMOV SS,AXMOV AH,01H ;从键盘录入一个数,将其ascall码存于ALINT 21HSUB AL,30H ;将acsall码减去30H获得该数大小存于ALMOV BL,02H ;BL赋值为02HMUL BL ;AL乘以02H结果存在AX,表示该数平方的MOV BP,AX ;AX的值赋给BPMOV DL,DS:[BP] ;将十位数赋给DLMOV AH,02H ;输出十位数INT 21H ;MOV DL,DS:[BP+1] ;将个位数赋给DLMOV AH,02H ;输出个位数INT 21HMOV AH,4CHINT 21HCSEG ENDSEND START实验三DSEG SEGMENTDATA1 DB 01H,-02H,03HDSEG ENDSSSEG SEGMENT STACKSKTOP DB 00HSSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEGASSUME SS:SSEGSTART: MOV AX,DSEGMOV DS,AXMOV AX,SSEGMOV SS,AXXOR BP,BPMOV AH,DS:[BP]MOV AL,DS:[BP+01H]MOV BH,DS:[BP+02H] ;三个数分别置于AH AL BH中CMP AH,AL ;比较AH AL大小JL MOVE1 ;若AH小于AL,跳跃到MOVE1MOV BL,AHMOV AH,ALMOV AL,BL ;AH与AL交换MOVE1: CMP AL,BH ;比较AL与BH大小JL MOVE2 ;若AL<=BH,跳跃到MOVE2MOV BL,ALMOV AL,BHMOV BH,BL ;AL与BH交换MOVE2: MOV BL,00H ;BH赋值为0CMP AH,BL ;比较AH与0的大小JL MOVE3 ;若AH<=0,跳跃到MOVE3MOV DL,'+' ;若AH>0,则输出‘+’MOV AH,02HINT 21H ;JMP MOVE5MOVE3: CMP BH,BLJL MOVE4MOV DL,' 'MOV AH,02HINT 21HJMP MOVE5MOVE4: MOV DL,'-'MOV AH,02HINT 21HMOVE5: MOV AH,4CHINT 21HCSEG ENDSEND START七、思考题(必需回答)写明如下问题1.按照操作顺序写出上机操作的步骤;(1)在编辑器中输入汇编语言程序,点击编译,查看有无语法类型的错误(2)用link.exe链接(3)链接完毕,用cmd/c运行程序,查看运行结果(4)输入不同的数据多次运行并记录(5)用debug命令在debug下运行2.上机操作的步骤与顺序可以调整吗?为什么?不可以调整;因为如果调整了的话将无法正常进行上机操作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 命令用来设置指定内存单元的值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码,分别输出。

相关主题