汇编实验报告代码例文.docx
《汇编实验报告代码例文.docx》由会员分享,可在线阅读,更多相关《汇编实验报告代码例文.docx(17页珍藏版)》请在冰豆网上搜索。
![汇编实验报告代码例文.docx](https://file1.bdocx.com/fileroot1/2023-2/24/bff5b450-ac0a-4a4e-bfbe-7e32fb87fb3d/bff5b450-ac0a-4a4e-bfbe-7e32fb87fb3d1.gif)
汇编实验报告代码例文
汇编语言程序设计实验报告
实验名称
上机过程及顺序结构与分支结构程序设计实验
班
级
学
号
姓
名
日
期
成
绩
评
阅
人
软件学院
一、实验目的与意义1、掌握汇编语言程序设计的基本方法和技能;2、熟练掌握使用全屏幕编辑程序EDIT编辑汇编语言源程序;3、熟练掌握宏汇编程序MASM的使用;4、熟练掌握连接程序LINK的使用。
5、掌握分支程序的结构6、掌握分支程序的设计、调试方法
二、实验环境上机号24#操作系统windowsxpprofessionalsp2
软件环境Editplus+MASM+LINK+DEBUG
三、实验的预习内容汇编程序上机的主要分为编辑,汇编,连接,执行等几个步骤
汇编语言的工作环境
为了运行汇编语言程序磁盘上应该有下列文件
MASM.EXELINK.EXECREF.EXEDEBUG.COM或DEBUG.EXE
1、汇编语言源程序的汇编过程
汇编语言源程序的汇编过程是是利用汇编程序(MASM)对已编辑好的源程序文件(.ASM)进行汇编,将源程序文件中以ASCII码表示的助记符指令逐条翻译成机器码指令,并完成源程序中的伪指令所指出的各种操作,最后可以建立3个文件扩展名为.OBJ的目标文件、扩展名为.LST的列表文件和扩展名为.CRF的交叉索引文件。
目标文件是必须建立的,它包含了程序中所有的机器码指令和伪指令指出的各种有关信息,但该文件中的操作数地址还不是内存的绝对地址,只是一个可浮动的相对地址。
列表文件(.LST)中包含了源程序的全部信息(包括注释)和汇编后的目标程序,列表文件可以打印输出,可供调试检查用。
交叉索引文件(.CRF)是用来了解源程序中各符号的定义和引用情况的。
.LST和.CRF两个文件不是必须建立的,可有有无,可以通过汇编时的命令加以选择。
在对源程序文件(ASM文件)汇编时,汇编程序将对ASM文件进行两遍扫描,若程序文件中有语法错误,则结束汇编,汇编程序将指出源程序中存在的错误,这时应返回编辑环境修改源程序中的错误,再经过汇编,直到最后得到无错误的目标程序,即OBJ文件。
因此,汇编程序的主要功能可以概括为以下三点
(1)检查源程序中的语法错误,并给出错误信息;
(2)产生目标程序文件(OBJ文件),并可给出列表文件(.LST文件);(3)展开宏指令。
汇编程序是系统提供的用于汇编的系统软件,目前常用的汇编程序有Microsoft公司推出的宏汇编程MASM(MACROASSEMBLER)和BORLAND公司推出的TASM(TURBO
ASSEMBLER)两种。
Microsoft公司推出有宏汇
编程序MASM和小汇编程序ASM两种,二者的区别在于MASM有宏处理功能,而ASM没有宏处理功能,因此,MASM比ASM的功能强大,但MASM需要占据较大的内存空间,当内存空间较小时(如64KB),只能使用ASM。
2、目标程序的连接过程
汇编后产生的目标程序(OBJ文件)并不是可执行程序文件(EXE文件),还不能直接运行,它必须通过连接程序(LINK)连接成一个可执行程序后才能运行。
连接程序进行连接时,其输入有两个部分一是目标文件(.OBJ),目标文件可以是一个也可以是多个,可以是汇编语言经汇编后产生的目标文件,也可以是高级语言(例如C语言)经编译后产生的目标文件;另一是库文件(.LIB),库文件是系统中已经建立的,主要是为高级语言提供的。
连接后输出两个文件,一是扩展名为.EXE的可执行文件,另一个是扩展名为.MAP的内存分配文件,它是连接程序的列表文件,又称为连接映像(LinkMap),它给出每个段在存储器中的分配情况,该文件可有可无。
连接程序给出的“无堆栈段的警告性错误”并不影响程序的运行。
所以,到此为止,连接过程已经结束,可以在操作系统下执行该.EXE程序了。
3、汇编语言和DOS操作系统的接口
编写的汇编语言源程序是在DOS环境下运行时,必须了解汇编语言是如何同DOS操作系统接口的。
用编辑程序把源程序输入到机器中,用汇编程序把它转换为目标程序,用连接程序对其进行连接和定位时,操作系统为每一个用户程序建立了一个程序段前缀区PSP,其长度为256个字节,主要用于存放所要执行程序的有关信息,同时也提供了程序和操作系统的接口。
操作系统在程序段前缀的开始处(偏移地址H)安排了一条INT2H软中断指令。
INT2H中断服务程序由DOS提供,执行该服务程序后,控制就转移到DOS,即返回到DOS管理的状态。
因此,用户在组织程序时,必须使程序执行完后能去执行存放于PSP开始处的INT2H指令,这样便返回到DOS,否则就无法继续键入命令和程序。
DOS在建立了程序段前缀区PSP之后,将要执行的程序从磁盘装入内存。
在定位程序时,DOS将代码段置于PSP下方,代码段之后是数据段,最后放置堆栈段。
内存分配好之后,DOS就设置段寄存器DS和ES的值,以使它们指向PSP的开始处,即INT2H的存放地址,同时将CS设置为PSP后面代码段的段地址,IP设置为指向代码段中第一条要执行的指令位置,把SS设置为指向堆栈的段地址,让SP指向堆栈段的栈底,然后系统开始执行用户程序。
四、实验的步骤与调试方法1、实验步骤图
五、实验数据与实验结果1、实验一,题目一中教材P51页程序编辑、连接、单步执行后的输出结果
2、用E命令修改结果(修改B6B:
1的数据68为32)
用G命令查看结果(查看地址为B6B:
1处的情况)
1、用A命令修改程序(修改ADD为SUB)
程序执行SUB结果为
实验一,题目二(正数、负数、DW、DD)
4个数的存储情况
实验二,顺序结构程序设计实验
十进制输出
十六进制输出
实验三、分支程序设计实验
1、最后输出结果为2D(空格),而-1H,-13H,-7H(内存地址为,1,2)这组数据比较后的结果就是输出空格2、源程序分配内存连续可以知道DATA2DB
1H,13H,7HDATA3DB
-9H,3H,-8H这两组数据的地址依次是3,4,5,6,7,8)
所以在debug中使用A命令进行如下修改
将地址3,4,5对应的三个数即是1H,13H,7H进行比较,并输出结果为2B,如下图单步执行结果
2B所对应的即是“+”继续修改地址为6,7,8对应的数为-9H,3H,-8H可以预料输出结果为空格下面进入debug修改
修改完以后再单步执行输出结果如下
DL,2就是把空格输出,而题意就是异号的数比较输出空格
六、实验用程序清单实验一,题目1
;----------------------------------------------------------;东北大学29366;----------------------------------------------------------;QQ9156571;-----------------------------------------------------------DSEGSEGMENT
;数据段开始DATA1DB
26H,15H
;原始数据DATA2DW
H
;保存结果单元DSEGENDS
;数据段结束SSEGSEGMENTSTACK
;堆栈段开始SKTOPDB
2DUP()SSEGENDS
;堆栈段结束
CSEGSEGMENT
;代码段开始
ASSUME
CS:
CSEG,DS:
DSEG
ASSUME
SS:
SSEG
START:
MOV
AX,DSEG
;初始化数据段基址
MOV
DS,AX
MOV
AX,SSEG
;初始化堆栈段基址
MOV
SS,AX
MOV
SP,SIZESKTOP
MOV
AL,DATA1
;取第一个数据
ADD
AL,DATA1+1
;与第二个数相加
MOV
BYTEPTRDATA2,AL;保存结束
MOV
AH,4CH
;返回DOS
INT
21HCSEGENDS
;代码段结束
END
START
;源程序结束
实验一,题目2
;----------------------------------------------------------;东北大学29366;----------------------------------------------------------;QQ9156571;-----------------------------------------------------------DSEGSEGMENTNUMDBH,-8H
ASCDW211HUSRDD29366HDSEGENDS
SSEGSEGMENTSTACKSKTOPDB2DUP()SSEGENDS
CSEGSEGMENT
ASSUME
CS:
CSEG,DS:
DSEG
ASSUME
SS:
SSEG
START:
MOV
AX,DSEG
MOV
DS,AX
MOV
AX,SSEG
MOV
SS,AX
MOV
SP,SIZESKTOP
MOV
AL,NUM
MOV
AH,NUM+1
MOV
CX,ASC
MOV
AH,4CH
INT
21HCSEGENDS
END
START
实验二
;----------------------------------------------------------;东北大学29366;----------------------------------------------------------;QQ9156571;-----------------------------------------------------------DSEGSEGMENTNUMDB
,1D,4D,9D,16D,25D,36D,49D,64D,81DDSEGENDS
SSEGSEGMENTSTACKSKTOPDB
2DUP()SSEGENDS
CSEGSEGMENT
ASSUME
CS:
CSEG,DS:
DSEG
ASSUME
SS:
SSEGSTART:
MOV
AX,SEGNUM
;初始化
MOV
DS,AX
MOV
AX,SSEG
MOV
SS,AX
MOV
SP,SIZESKTOP
MOV
BX,OFFSETNUM
;制表
MOV
AH,1H
;输入一个数,存在AL中
INT
21H
SUB
AL,""
;用ASCII减去
XLAT
;获取输出结果存在AL中
MOV
AH,
PUSH
AX
;保存AX
MOV
DL,DH
;输出一个回车换行
MOV
AH,2H
INT
21H
MOV
DL,AH
MOV
AH,2H
INT
21H
POP
AX
MOV
BL,16D
;以16进制显示结果
;MOV
BL,1D
;以1进制显示结果
DIV
BL
PUSH
AX
MOV
DL,AL
;输出高位的数字
ADD
DL,3H
MOV
AH,2H
INT
21H
POP
AX
;输出低位的数字
MOV
DL,AH
ADD
DL,3H
MOV
AH,2H
INT
21H
MOV
AH,4CH
;程序退出
INT
21HCSEGENDS
END
START实验三
;----------------------------------------------------------
;东北大学29366;----------------------------------------------------------;QQ9156571;-----------------------------------------------------------DSEGSEGMENTDATA1DB
-1H,-13H,-7HDATA2DB
1H,13H,7HDATA3DB
-9H,3H,-8HDSEGENDSSSEGSEGMENTSTACKSKTOPDB
2DUP()SSEGENDSCSEGSEGMENT
ASSUME
CS:
CSEG,DS:
DSEG
ASSUME
SS:
SSEGSTART:
MOV
AX,DSEG
MOV
DS,AX
MOV
AX,SSEG
MOV
SS,AX
MOV
SP,SIZESKTOP
MOV
AL,DATA1
;读入所有的数据
MOV
AH,DATA1+1
MOV
BL,DATA1+2
TEST
AL,AL
JS
NTIVE
TEST
AH,AH
JS
NULL
TEST
BL,BL
JS
NULL
MOV
DL,2BH
;输出"+"(+号的ASCII为2B)
JMP
MOVENTIVE:
TEST
AH,AH
JNS
NULL
TEST
BL,BL
JNS
NULL
MOV
DL,2DH
;输出"-"(-号的ASCII为2D)
JMP
MOVENULL:
MOV
DL,2H
;输出空格""(空格的ASCII为2)
MOVE:
MOV
AH,2H
;输出DL
INT
21H
MOV
AH,4CH
INT
21HCSEGENDS
END
START
七、思考题按照操作顺序写出上机操作的步骤;
上机操作的步骤与顺序可以调整吗?
为什么?
上机操作的步骤与顺序不可以调整,汇编语言程序设计只能按照先编辑源代码,连接,运行,debug的顺序,如果调整顺序以后,程序执行会出错。
写出用DEBUG中的E命令修改内存单元内容的两种方法;E+address
或者Eaddress[list]
写出用DEBUG中的A命令修改指令的方法及应注意的问题;AaddressAddress指令
需要注意的是指令后面必须跟操作数总结DEBUG中E、D、U命令的功能;E(键入)
将数据输入到内存中指定的地址。
D(转储)
显示一定范围内存地址的内容。
U(反汇编)
反汇编字节并显示相应的原语句,其中包括地址和字节值。
反汇编代码看起来象已汇编文件的列表。
总结DEBUG中P、G、T命令的功能;P(执行)
执行循环、重复的字符串指令、软件中断或子例程;或通过任何其他指令跟踪。
G(转向)
运行当前在内存中的程序。
T(跟踪)
从当前段地址开始执行指定的代码数,每执行一次显示所有寄存器(包括标志寄存器)的值。
写出数据定义伪指令DB、DW和DD存储整数的格式;DB12HDW1234HDD12345678H同一个正数分别用DB、DW和DD定义,存储格式有何变化?
所占用的内存大小不同,DB为一个字节,DW为两个字节,DD为三个字节,高地址存高位,低地址存地位,高位补
同一个负数分别用DB、DW和DD定义,存储格式有何变化?
所占用的内存大小不同,DB为一个字节,DW为两个字节,DD为三个字节,高地址存高位,低地址存地位,高位补F1.自定义标号分别用DW和DD定义,存储格式有何变化?
DW存储的是偏移量,占用两个字节;DD存储的是段寄存器与偏移量,占四个字节,高位存段寄存器,低位存偏移量。
1DB、DW和DD在定义数据串时有何不同?
DB定义数据串时,每个数据占用一个字节内存单元;DW定义数据串时,每个数据占用两个字节内存单元;DD定义数据串时,每个数据占用四个字节内存单元1说明十六进制数转换为ASCII码的方法;将16进制数除以16,商与余数分别加上的ASCII码,分别输出。
1字符串(例如“Microsoft”)使用什么数据定义伪指令?
为什么?
用DB定义数据项为ASCII常数时,DB伪指令中可用引号括起任意多个(不超过一个逻辑行)字符,而在其他数据定义伪指令中,只能用引号括起最多2个字符。
1顺序结构的程序能有多个出口吗?
为什么?
不能。
一个顺序程序只能有一个出口。
八、结束语通过这两次的程序设计实践,学习了汇编程序设计的基本方法和技能,基本操作和设
计流程,熟悉掌握使用全屏幕编辑程序EDIT编辑汇编语言源程序,掌握宏汇编程序MASM的使用,掌握连接程序LINK的使用,掌握分支程序的结构,掌握分支程序的设计、调试方法。
熟悉了汇编语言程序设计中用到的常用命令,如A,E,U,T等。
实验过程中发现了一些粗心的问题,比如有时候汇编时输入法为中文,结果导致编译不通过,老是有错误。
最后在同学的帮助下才发现那个微小的错误。
以后的编程过程中一定要注意输入的符号的半角全角状态。
九、参考文献1、XX一下你就知道2、《汇编语言程序设计》齐志儒主编东北大学出版社出版3、XX百科4、《汇编语言程序设计实验指导书》
实验成绩
考查内容分数得分做好实验内容的预习,写出预习报告1
了解实验题目的调试方法1
按实验要求预先设计好程序1
认真记录实验数据并分析实验结果1
实验后按要求书写实验报告,记录实验用数据及运行结果3
创新能力强,在实验中设计的程序有一定的通用性,算法优化2
实验过程中,具有严谨的学习态度,认真、踏实、一丝不苟的科学作风1