工学汇编程序实验指导140.docx
《工学汇编程序实验指导140.docx》由会员分享,可在线阅读,更多相关《工学汇编程序实验指导140.docx(25页珍藏版)》请在冰豆网上搜索。
![工学汇编程序实验指导140.docx](https://file1.bdocx.com/fileroot1/2023-1/6/4cc482ea-b738-4b95-9ec1-2018a7982e5f/4cc482ea-b738-4b95-9ec1-2018a7982e5f1.gif)
工学汇编程序实验指导140
组成原理与汇编
8088/8086汇编语言实验指导
仰恩大学计算机学院电子工程系
一、 实验目的
1.初步了解8086/8088汇编程序的基本结构,利用WindowsXP附件的写字板编辑简单的
汇编语言源程序,形成扩展名为.ASM的文本文件格式(即汇编源程序)。
2.学习宏汇编程序MASM.EXE,连接程序LINK.EXE,调试程序DEBUG.EXE的使用。
3.在微机上、在MasmforWindows集成实验环境下,运行并调试8086/8088汇编源程序。
二、上机前的准备
1.PC机的操作系统可以是Windoes98,也可以是WindowsXP。
2.硬盘上安装MasmforWindows集成实验环境软件,上面应有MASM、LINK、DEBUG等文件,
还应有足够的空间以容纳你的汇编源程序。
3.学习以上三个文件的使用方法,准备好上机的源程序并认真去读懂它。
三、用“写字板”编辑汇编的源程序
1.用“写字板”编辑好源文件LH,LH假设为李华同学的源程序文件名(下同),则文件名是
LH.ASM,文件的扩展名一定要用.ASM。
然后保存在C:
盘的目录下。
2.编辑你的源程序时,注意不要有空行、光标也不要超过最后一行。
四、MASM.EXE编译程序的运行
在MasmforWindows集成实验环境中打开LH.ASM文件,然后在点击运行项,在其下拉菜单中点击编译成目标文件(OBJ),如果你输入的文件完全正确,将在下面的栏中显示:
编译源程序C:
\>LH.ASM
编译成功
汇编的目的是要形成目标文件,即机器代码文件,也就是LH.OBJ文件。
该文件不是文本文件,因此用编辑软件是看不到的,看到的只是一些乱码。
五、LINK.EXE生成可执行文件的运行
在MasmforWindows集成实验环境中点击运行项,在其下拉菜单中点击生成可执行文件(EXE),如果你输入的文件完全正确,将在下面的栏中显示:
编译源程序C:
\>LH.ASM
生成EXE文件成功
对LH.OBJ文件连接的主要目的是要生成LH.EXE文件。
扩展名为.EXE文件是在DOS状态下的可执行文件。
你只要键入LH.EXE文件的文件名LH就可以运行文件。
六、DEBUG.EXE调试程序的运行
DEBUG是调试程序,它是对EXE文件进行调试。
在MasmforWindows集成实验环境中点击运行项,在其下拉菜单中点击DEBUG调试,在屏幕上出现如下信息:
-
上面的‘-’是DEBUG状态下的提示符,表示目前系统在DEBUG的控制之下。
我们主要学习
DEBUG的Q,R,U,G,D,E,F,T命令。
这些命令的使用方法是在‘-’提示符后键入相应
命令的字母,如:
-Q
回车后就立即返回DOS状态。
上面各命令分别解释如下:
1.-Q表示退出DEBUG状态。
2.-R显示CPU中除FLAG寄存器外的14个寄存器的内容,对于FLAG寄存器只显示它的OF,
DF,IF,SF,ZF,AF,PF,CF的状态。
它是用两个字母来表示是0还是1的。
表示的字母
如下:
标志位名
OF
DF
IF
SF
ZF
AF
PF
CF
为1对应符
OV
DN
EI
NG
ZR
AC
PE
CY、
为0对应符
NV
UP
DI
PL
NZ
NA
PO
NC
如想查看某一寄存器的内容,可在-R后键入寄存器名,如:
-RAX
AX2B6F
:
1200
上面第二行2B6F为AX中的内容,第三行冒号后的1200为你键入的要修改的内容。
3.-U它是反汇编调试命令。
(选看)
因为被调试的程序LH.EXE是机器码语言,必须翻译成汇编语言程序人们才好读懂。
注意反汇编的范围是在本段内。
该命令有下面三种格式:
-U-----(它是将当前CS:
IP所指的地址开始的机器码反汇编32个字节指令。
)
-U地址-----(地址是反汇编开始的地址,可以是偏移地址也可以是逻辑地址。
如:
-U2A[002A是反汇编开始的偏移地址]
-U11D0:
0100[11D0:
0100是反汇编开始的逻辑地址])
-U地址1地址2-----(从地址1反汇编到地址2,如:
-U105F[从当前段的偏移地址0010反汇编到005F]
-U01F5:
105F[从01F5段的0010偏移地址开始反汇编到本段
的005F为止]
4.-G它是设置断点及启动程序运行命令。
它有三种格式:
-G-----(断点是程序结束,它从当前CS:
IP所指地址开始直到程序结束。
)
-G=地址-----(从指定的地址开始直到程序结束)
-G=地址1地址2----(从指定的地址1开始运行到地址2结束)
5.-D它是显示内存单元内容命令。
它有两种格式:
-D地址-----(显示从当前地址开始的内存128个字节的内容,如:
-DDS:
00[显示从DS所表示的数据段段地址,偏移地址0000开始
的128个字节的内容])
-D地址1地址2-----(显示从地址1开始到地址2所有单元的内容,如:
-DDS:
00FF
[显示从DS所表示的数据段段地址,偏移地址0000开始到
偏移地址为00FF结束的所有单元的内容])
6.-E一次修改一个内存单元内容命令。
格式为:
-E地址-----(命令输入后显示该地址所指示单元的内容,此时可键入要修改的
内容。
修改后可按回车键或空格键,按回车键为结束修改,按空
格键可继续修改下一单元的内容)
7.-F将内存中若干个连续单元赋与同一数值,也就是修改。
常用该命令给内存某一区域清零。
如:
-FDS:
003F00-----(将地址为DS:
0000~DS:
003F的64个单元内容设为00H,也就是对这64个单元清零)
8.-T执行一条或多条指令的命令,也可称为单步执行命令。
格式:
-T-----(命令后面没有参数,表示执行当前CS:
IP为地址所指的一条指令)
-T地址-----(执行地址所指的一条指令)
-T地址|n-----(执行以当前地址开始的n条指令)
实验一:
运行一个简单的汇编语言源程序
1.实验目的:
1)通过运行一个简单的汇编语言源程序,了解8086/8088汇编语言源程序的逻辑结构。
2)初步掌握汇编语言源程序上机汇编、调试、运行的过程。
2.实验程序:
下面是一个16位二进制加法的源程序:
STACKSEGMENTPARASTACK'STACK'
DW256DUP(?
);设置堆栈段
TOPLABELWORD
STACKENDS
DATASEGMENT
DTADW2C3BH
DTBDW0A6DFH;设置数据段
DTCDW?
DATAENDS
COSEGSEGMENT
ASSUMECS:
COSEG,SS:
STACK,DS:
DATA;规定COSEG是代码段,STACK堆栈段,DATA是
START:
MOVAX,STACK;数据段
MOVSS,AX;设置堆栈段的段地址
MOVAX,TOP
MOVSP,AX;设置堆栈指针
MOVAX,DATA;
MOVDS,AX;设置数据段段地址
MOVBX,DTA
MOVCX,DTB;16位二进制加法
ADDBX,CX
MOVDTC,BX
MOVAH,4CH
INT21H;返回DOS操作系统
COSEGENDS
ENDSTART
3.目标文件与列表文件
汇编后要生成目标文件(.OBJ文件),列表文件(.LST文件)。
最重要的是目标文
件,它是源程序的机器码文件,它将通过LINK文件的连接生成可以运行的执行文件,
即.EXE文件。
汇编后生成的列表文件(也就是.LST文件)如下,列表文件是为程序的
设计者进行观察、分析用的。
1.Microsoft(R)MacroAssemblerVersion5.00
2.0000STACKSEGMENTPARASTACK'STACK'
3.00000100DW256DUP(?
)
4.0200TOPLABELWORD
5.0200STACKENDS
6.0000DATASEGMENT
7.00002C3BDTADW2C3BH
8.0002A6DFDTBDW0A6DFH
9.0004?
?
?
?
DTCDW?
10.0006DATAENDS
11.0000COSEGSEGMENT
ASSUMECS:
COSEG,SS:
STACK,DS:
DATA
12.0000B8----RSTART:
MOVAX,STACK
13.00038ED0MOVSS,AX
14.000536:
A10200RMOVAX,TOP
15.00098BE0MOVSP,AX
16.000BB8----RMOVAX,DATA
17.000E8ED8MOVDS,AX
18.00108B1E0000RMOVBX,DTA
19.00148B0E0002RMOVCX,DTB
20.001803D9ADDBX,CX
21.001A891E0004RMOVDTC,BX
22.001EB44CMOVAH,4CH
23.0020CD21INT21H
24.0022COSEGENDS
25.ENDSTART
在上面的列表文件中的第22~24行是列表程序的核心部分,这一部分对应着用户源程序重要
执行的代码段。
我们观察第20行:
20.001803D9ADDBX,CX
“0018(16进制)”是“ADDBX,CX”这条指令在代码段中的偏移地址,它的段地址要通过
连接后生成的.EXE文件在运行时由操作系统来决定。
“03D9”是这条指令的机器码,“03”是操作
码,表示进行加法运算。
“D9”是操作码字节,它表示源操作数是“CX寄存器”,目的操作数是“BX
寄存器”。
再观察第12行:
12.0000B8----RSTART:
MOVAX,STACK
偏移地址是“0000”,表示“MOVAX,STACK”是代码段的第一条指令,“B8”是操作码,表示
要将堆栈段“STACK”的段地址给“AX寄存器”。
“----R”表示浮动的地址,因为堆栈段的段地
址要通过连接运行时由操作系统来决定。
4.上机操作
1).编辑:
用“写字板”编辑好上例源文件存在C:
\>目录下.TEST1.ASM
2).汇编:
在MasmforWindows集成实验环境中打开TEST1.ASM文件,然后在点击运行项,在其下拉菜单中点击编译成目标文件(OBJ),如果你输入的文件完全正确,将在下面的栏中显示:
编译源程序C:
\>TEST1.ASM
编译成功
3).连接:
在MasmforWindows集成实验环境中点击运行项,在其下拉菜单中点击生成可执行文件(EXE),如果你输入的文件完全正确,将在下面的栏中显示:
编译源程序C:
\>TEST1.ASM
生成EXE文件成功
4).调式:
在MasmforWindows集成实验环境中点击运行项,在其下拉菜单中点击DEBUG调试,在屏幕上出现如下信息:
-
(1)用–U命令观察文件,注意文件的终止地址.
(2)用–T命令观察命令执行情况,单步执行.
(3)用–G命令运行程序:
-G00终止地址
(4)用–D命令观察内存的情况:
-DDS:
00
5)在DEBUG状态下,用E命令改变两个加数的大小,再运行后,用同样方法观察运算结果。
5.思考题:
如何编写32位的加法(或减法)程序?
实验二:
DEBUG命令的使用
1.实验目的:
DEBUG的R,U,G,D,E,F,T,Q命令的使用方法。
1).-R显示CPU中除FLAG寄存器外的14个寄存器的内容,
如想查看某一寄存器的内容,可在-R后键入寄存器名,如:
-RAX
AX2B6F
:
1200
上面第二行2B6F为AX中的内容,第三行冒号后的1200为你键入的要修改的内容。
2).-U它是反汇编调试命令。
-U-----(它是将当前CS:
IP所指的地址开始的机器码反汇编32个字节指令。
)
-U地址1地址2-----(从地址1反汇编到地址2,如:
-U002F[从当前段的偏移地址0000反汇编到002F]
3).-G它是设置断点及启动程序运行命令。
4).-D它是显示内存单元内容命令。
它有两种格式:
-D地址-----(显示从地址开始的内存128B的内容,如:
-DDS:
00[显示从DS段地址,偏移地址0000开始的128个字节的内容])
5).-E一次修改一个内存单元内容命令。
格式为:
-E地址
6).-F将内存中若干个连续单元赋与同一数值,也就是修改。
常用该命令给内存某一区域清零。
如:
-FDS:
003F00-----(将地址为DS:
0000~DS:
003F的64个单元内容设为00H)
7).-T称为单步执行命令。
格式:
-T-----(命令后面没有参数,表示执行当前CS:
IP为地址所指的一条指令)
-T地址-----(执行地址所指的一条指令)
8).–Q表示退出DEBUG状态。
2.实验程序:
将自然增减的31个数据(00H-0FH-00H)写入内存,内存的首地址为20000H,源程序如下:
STACKSEGMENTSTACK
DW64DUP(?
);设置堆栈段
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,SS:
STACK
MAINPROCFAR
START:
MOVAX,2000H;数据段段地址
MOVDS,AX
MOVSI,0;数据段偏移地址
MOVCL,0FH;
XORAX,AX;0AX
A1:
MOV[SI],AL
INCAL
INCSI;递增00—0FH
DECCL
JNZA1;CL=0,结束循环
MOVCX,10H
A2:
MOV[SI],AL
INCSI
DECAL;递减0F--00H
LOOPA2;CX=0,结束循环
INT20H;程序结束
MAINENDP
CODEENDS
ENDSTART
上机操作:
1).编辑:
用“写字板”编辑好源文件存在C:
\>目录下.TEST2.ASM
2).汇编:
在MasmforWindows集成实验环境中打开TEST2.ASM文件,然后在点击运行项,在其下拉菜单中点击编译成目标文件(OBJ),如果你输入的文件完全正确,将在下面的栏中显示:
编译源程序C:
\>TEST2.ASM
编译成功
3).连接:
在MasmforWindows集成实验环境中点击运行项,在其下拉菜单中点击生成可执行文件(EXE),如果你输入的文件完全正确,将在下面的栏中显示:
编译源程序C:
\>TEST2.ASM
生成EXE文件成功
4).调式:
在MasmforWindows集成实验环境中点击运行项,在其下拉菜单中点击DEBUG调试,在屏幕上出现如下信息:
-
(1)用–U命令观察文件,注意文件的终止地址.
(2)用–T命令观察命令执行情况,单步执行.
(3)用–G命令运行程序:
-G001F
(4)用–D命令观察内存的情况:
-DDS:
00
3.思考题:
在实验程序TEST2.ASM基础上,写出将内存单元(0000H—000FH)的内容送到(0030H—003FH)的程序,并存在C:
\>目录下.TEST21.ASM。
实验报告中写出汇编及连接通过的源程序,写出用DEBUG观察到内存(0000H—003FH)的内容。
实验三:
变量的属性
1.实验目的:
1)通过本实验初步了解汇编语言源程序的结构。
认识和理解变量的五个属性
----SEG,OFFSET,TYPE,LENGTH,SIZE。
主要是前面三个属性。
2)学会在DEBUG下调试程序,了解变量在内存中存放的情况。
2.上机程序:
下面是列表程序(去掉了一些不重要的部分),下面列表程序的右边部分是要从键盘输入
的源程序。
1NAMEPROPERTYOFVAIRIABLE
20000STACKSEGMENTPARASTACK'STACK';堆栈段的起始伪指令
3000000C8[STAPNDB256DUP(?
);设置堆栈区的长度
TOP=LENGTHSTAPN;使堆栈指针指向栈底
800C8STACKENDS;堆栈段中止的伪指令
90000DATASEGMENT;数据段的起始伪指令
10000020DATA1DB20H;本数据段有11个变量
110001A204FF00DATA2DW0A204H,-100H
120005FD05DATA3DB(-1*3),(15/3)
13000745230100DATA4DD12345H
14000B30313233DATA5DB'0123'
15000F414200430044DATA6DW'AB','C','D'
160015?
?
DATA7DB?
170016?
?
?
?
?
?
?
?
DATA8DD?
18001A000D[DATA9DB10DUP(?
)
2200270003[DATA10DB2DUP(0CH,0DH,2DUP(00,0EEH))
3100390002[DATA11DW2DUP(?
)
35003DDATAENDS;数据段中止的伪指令
360000COSEGSEGMENT;码段(程序段)开始伪指令
37ASSUMECS:
COSEG,SS:
STACK,DS:
DATA,ES:
DATA
380000B8----RSTART:
MOVAX,STACK;将堆栈段的段地址给SS
3900038ED0MOVSS,AX
400005B800C8MOVAX,TOP;将堆栈指针给SP
4100088BE0MOVSP,AX
42000AB8----RMOVAX,DATA;将数据段的段地址给DS
43000D8ED8MOVDS,AX
44000F8EC0MOVES,AX;将数据段的段地址给ES
450011BB----RMOVBX,SEGDATA4;将DATA4的段地址给BX
460014891E001ARMOVWORDPTRDATA9,BX;BX中的内容给DATA9
470018BB0007RMOVBX,OFFSETDATA4;DATA4的偏移地址给BX
48001B891E001ERMOVWORDPTRDATA9+2,BX;BX中的内容给DATA9+2
49001FB204MOVDL,TYPEDATA4;DATA4的类型给DL
50002188160022RMOVDATA9+4,DL;DL中的内容给DATA9+4
510025B201MOVDL,LENGTHDATA4;DATA4的长度给DL
52002788160023RMOVDATA9+5,DL;DL中的内容给DATA9+5
53002BB204MOVDL,SIZEDATA4;DATA4的尺寸给DL
54002D88160024RMOVDATA9+6,DL;DL中的内容给DATA9+6
550031B103MOVCL,LENGTHDATA10;DATA10的长度给CL
560033880E0025RMOVDATA9+7,CL;CL中的内容给DATA9+7
570037B103MOVCL,SIZEDATA10;DATA10的尺寸给CL
580039880E0026RMOVDATA9+8,CL;CL中的内容给DATA9+8
59003DA10001RMOVAX,DATA2;变量DATA2的内容给AX
60004003060003RADDAX,DATA2+2;(AX)+变量DATA2+2给
AX
610044A30039RMOVDATA11,AX;AX中的内容给变量DATA11
6200478B160001RMOVDX,DATA2;变量DATA2的内容给DX
63004B2B160003RSUBDX,DATA2+2;(DX)-变量DATA2+2给
DX
64004F8916003BRMOVDATA11+2,DX;DX中的内容给变量DATA11+2
650053B44CMOVAH,04CH;准备返回DOS
660055CD21INT21H;返回DOS
670057COSEGENDS;码段到此结束的伪指令
68ENDSTART;程序到此结束的伪指令
3.实验成功后认真填写下表:
变量
名称
偏移
地址
内容
变量
名称
偏移
地址
内容
变量
名称
偏移
地址
内容