当前位置:文档之家› 汇编实验报告一

汇编实验报告一

汇编语言程序设计实验报告实验名称上机过程及顺序结构与分支结构程序设计实验班级学号姓名日期成绩评阅人软件学院一、实验目的与意义1、掌握汇编语言程序设计的基本方法和技能;2、熟练掌握使用全屏幕编辑程序EDIT编辑汇编语言源程序;3、熟练掌握宏汇编程序MASM的使用;4、熟练掌握连接程序LINK的使用;5、学习数据传送及算数和逻辑运算指令的用法;6、掌握分支程序的结构;7、掌握分支程序的设计、调试方法;8、熟悉在PC机上建立、汇编、连接、调试和运行8086汇编语言程序;二、实验环境操作系统:Windows XP调试软件:Edit Plus 3,MASM 5.0上机地点:综合楼311三、实验的预习内容(1)熟悉上机练习过程和伪指令实验实验预习内容:在实验前,充分熟悉Edit Plus 3的环境以及配置方法,熟悉各种debug 的常用指令:U、D、T、P、G、A、E及R命令的使用和含义,了解数据传送指令和算数以及逻辑运算指令的用法,在理论上了解数据的存储情况以及DD,DB,DW伪指令的用法和含义。

实验思路:按照书上的程序打入代码,进行汇编、连接和运行程序查看此时程序的运行情况,之后进入debug界面,分别使用U、D、T、P、G、A、E及R命令等常用指令,可查看此时的程序的执行状况以及此时寄存器的存储情况以及对于内存的使用情况。

程序一流程图:程序二流程图:(2)顺序结构程序设计实验实验预习内容:在实验前了解十进制,十六进制和ASCII 码之间的转换,了解如何从键盘中输入字符和回车换行,以及在屏幕中显示的汇编指令。

实验思路:从键盘中输入要计算的数字,将其进行平方运算,利用计算得到数字,了解十进制数字、十六进制数字与其对应ASCII 码的转换方法,将数字显示到屏幕上。

程序流程图:(3)分支程序设计实验实验预习内容:在实验前了解分支结构的特点,明白跳转指令和程序转移指令的使用的使用,以及两个数进行比较后各个标志位的变化。

实验思路:首先定义三个数,先比较前两个数的符号,如果相同则比较第二个数字和第三个数的符号,如果相同,利用左移一位判断正负,之后进行显示。

程序流程图:四、 实验的步骤与调试方法(1)熟悉上机练习过程和伪指令实验 实验步骤:上机实验首先要配置editplus 的环境,之后输入代码,运行debug ,在debug 中输入相应的指令,观察结果。

在程序中首先定义数据段和代码段,在定义数据时使用伪指令定义,之后运行debug ,了解了数据在内存中的存储。

之前对debug 的理解不深,有很多语句都不能很好的使用和理解,在经过这次实验后,对于数据的存储和debug 有了更深的理解。

程序二自行分析的数据存储情况: DA TA1: DA TA2: DA TA3:(2)顺序结构程序设计实验本实验刚开始规定用查表法来实现。

首先定义数据段定义数字,输入数字,将其转化成对应的地址偏移量,求的数据的地址送入BX ,求得平方后除以10得到商和余数,利用十进制与ASCII 码的转化将其输出到屏幕上。

十六进制与十进制类似,INT 21的2号功能每次只能输出一个字符,因此,需要将将结果转化成一个高位和一个低位存在不同寄存器中分别输出。

在实验过程中对于不能正确运行的时候,使用debug 中的T 和P 命令来执行得知程序执行情况。

(3)分支程序设计实验首先,实验先定义数据段的数据,通过将SI 的值赋为0,得到第一个数据的有效地址,将数据送入寄存器得到CF 值,之后按照同样的方法取得第二个数字,并把其送入寄存器。

使用RCL 指令将最高位送入CF 中,得到CF 是0还是1,如果不相同则取第三个数据进行比较,否则输出空格。

在取第三个数据之后仍然左移一位,得到CF 位,判断CF 是否相同,如果不同,则输出空格,如果相同则继续判断CF 位的数值,如果数值为1,则输出负号,如果数值为0,则输出正号。

实验开始不能很好的使用跳转命令等指令,走过很多弯路,在经过学习后,更好的了解了各种跳转指令。

在实验的过程中,开始不能输出负号,经验证得知没有很好的输入int 21H 的功能,因而无法正常从显示屏里输出。

经过更改,程序正常运行。

五、实验数据与实验结果实验一程序一:首先使用指令T 进行单步执行操作,执行的结果如下:从中可以看出初始的值为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,结果如图:实验三:实验中初始定义的值为-1,-2,-3经过单步运行结果如下:此时DL的值为2D,负号的ACSII码值为2D,所以输出结果正确。

之后把数据更改为1,2,3,输出结果如下,此时DL的值为2B,结果正确,示意图如下:使用E命令来修改数据:运行结果之后将数据更改为1,-2,-3,得到结果DL的值为20,结果仍然正确六、实验用程序清单(要有注释)(1)熟悉上机练习过程和伪指令实验题目一:DSEG SEGMENT ;数据段开始DA TA1 DB 13H,26H ;原始数据DA TA2 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,DA TA1 ;取第一个数据ADD AL,DA TA1+1 ;与第二个数据相加MOV BYTE PTR DA TA2,AL ;保存结果MOV AH,4CHINT 21H ;返回DOSCSEG ENDS ;代码段结束END START ;源程序结束题目二:DSEG SEGMENT ;数据段开始DA TA1 DB 3,-3,'A'DA TA2 DW 3,-3,'A'DA TA3 DD 3,-3,'A'DSEG ENDS ;数据段结束SSEG SEGMENT STACK ;堆栈段开始SKTOP DB 20 DUP(0)SSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEG,SS:SSEG ;代码段开始START: MOV AX,DSEG ;初始化数据段基址MOV DS,AXMOV AX,SSEG ;初始化堆栈段基址MOV SS,AXMOV AH,4CHINT 21H ;返回DOSCSEG ENDS ;代码段结束END START ;源程序结束(2)顺序结构程序设计实验DSEG SEGMENT ;建立数据段NUM DB 0D,1D,4D,9D,16D,25D,36D,49D,64D,81DSSEG SEGMENT STACK ;建立堆栈段SKTOP DB 20 DUP(0)SSEG ENDS ;堆栈段结束CSEG SEGMENT ;代码段开始ASSUME CS:CSEG,DS:DSEG,SS:SSEGSTART: MOV AX,DSEG ;初始化MOV DS,AXMOV AX,SSEGMOV SS,AXMOV SP,SIZE SKTOPMOV BX,OFFSET NUM ;制表MOV AH,01HINT 21H ;输入一个数,存入寄存器PUSH AX ;保存输入的数字MOV DL,0DHMOV AH,02HINT 21HMOV DL,0AHMOV AH,02HINT 21H ;回车换行POP AXSUB A L,30H ;转化成0-9的数字其中30h为0的ASCII码XLA TPUSH AX ;AX入栈XOR AH,AHMOV CH,10DIV CHADD AL,30HMOV CH,AHMOV DL,ALMOV AH,02HINT 21H ;转化成十进制MOV DL,CHADD DL,30HMOV AH,02HINT 21HMOV DL,0DHMOV AH,02HINT 21HMOV DL,0AHMOV AH,02H ;输出结果INT 21HPOP AX ;ax出栈MOV DL,16DIV DLMOV CH,AH ;除以16得到的余数MOV CL,AL ;除以16得到的商ADD AL,30HMOV DL,ALMOV AH,02HINT 21H ;输出高位ADD CH,30HMOV DL,CHMOV AH,02HINT 21H ;输出低位MOV AH,4CHINT 21HCSEG ENDS ;代码段结束END START ;程序结束实验三:DSEG SEGMENT ;数据段开始NUM DB -1,-2,-3DSEG ENDS ;数据段结束CSEG SEGMENT ;代码段开始SSEG SEGMENT STACK ;建立堆栈段SKTOP DB 20 DUP(0)SSEG ENDS ;堆栈段结束ASSUME CS:CSEG,DS:DSEGASSUME SS:SSEGSTART: MOV AX,DSEG ;初始化MOV DS,AXMOV AX,SSEG ;初始化堆栈段地址MOV SS,AXMOV SP,LENGTH SKTOP ;设置堆栈指针MOV SI,0 ;将0赋给SI,使偏移地址为0AGAIN: RCL NUM[SI],1 ;带进位左移一位JNC NEXT1 ;若CF=0,跳到NEXT1INC SI ;得到下一个数RCL NUM[SI],1 ;带进位左移一位JNC NEXT2 ;第一个是正数,第二个数是负数,跳到NEXT2INC SI ;取下一个数RCL NUM[SI],1 ;带进位左移一位JNC NEXT2 ;1和2为负数,3为正数,跳到NEXT2MOV DL,2DH ;都为负数,输出负号JMP FINISHNEXT1: INC SIRCL NUM[SI],1JC NEXT2 ;1为正数,2为负数,到NEXT2INC SIRCL NUM[SI],1JC NEXT2 ;1,2为正数,3为负数,到NEXT2MOV DL,2BH ;1,2,3为正数,输出正号JMP FINISHNEXT2: MOV DL,20HJMP FINISHFINISH: MOV AH,02HINT 21HMOV AH,4CHINT 21HCSEG ENDSEND START五、思考题(必需回答)写明如下问题1.按照操作顺序写出上机操作的步骤;答:首先应该配置EditPlus,然后使用masm.exe编译,生成.obj文件,之后使用link.exe连接,生成可执行文件,之后用cmd/c运行,最后用debug进行调试。

相关主题