《汇编语言》实验指导书V0918.docx
《《汇编语言》实验指导书V0918.docx》由会员分享,可在线阅读,更多相关《《汇编语言》实验指导书V0918.docx(85页珍藏版)》请在冰点文库上搜索。
《汇编语言》实验指导书V0918
《汇编语言》
实验指导书
教师:
关玉蓉
班级:
学期:
版本:
黄冈师范学院计算机学院
2014年9月15日
《微机原理与汇编语言》实验课的性质、目的及基本要求
《微机原理与汇编语言》是计算机科学与技术专业本科生学习其他课程(如接口技术、单片机等)的专业基础课程,因此是计算机类专业学生的必修课,该课程在学生的计算机专业知识结构中占有重要的地位。
本实验课的目的是加强学生《微机原理与汇编语言》的实践,使学生熟悉如何使用DEBUG调试程序,掌握汇编语言程序设计的基本方法和技术,并能用汇编语言进行简单的软件开发。
通过汇编语言程序的设计和调试,使学生从根本上认识、了解计算机的内部工作原理,深入体会、理解计算机如何实现各种复杂的运算与操作,掌握运用汇编语言解决有关硬件问题、不同语言环境的接口问题以及充分利用系统资源优化代码的基本方法,打下较扎实的系统软件、应用软件的程序设计基础,培养软件研制的基本技能。
目录
实验一调试工具的使用方法1
实验二汇编语言上机过程6
实验三选择与循环程序设计13
实验四子程序设计5
实验五中断与I/O程序设计10
实验六VC++与汇编语言的混合编程14
附录一8088汇编速查手册18
附录二常用的部分系统功能调用和BIOS中断调用21
附录三汇编语言常用出错信息26
实验一调试工具的使用方法
1.实验目的
掌握调试工具DEBUG的使用方法,理解汇编指令、存储单元和寄存器等有关概念,能够对简单的汇编语言程序进行调试。
2.实验内容
(1)学习调试工具DEBUG的使用方法,熟悉DEBUG常用命令的功能和用法。
(2)利用DEBUG调试简单的汇编语言程序,体会汇编指令的功能、寄存器的作用、存储单元地址与内容的概念和作用、以及程序的执行过程。
3.实验要求
(1)掌握DEBUG的常用命令和基本的程序调试方法
(2)熟悉和掌握指令系统常用指令的功能和用法,能熟练运用DEBUG调试工具调试简单的程序,并初步掌握使用DOS系统功能调用的方法。
4.重点与难点
存储器和寄存器的概念、各寄存器的用途、常用指令的功能和用法、用DEBUG调试程序的方法。
5.实验结果验收
熟练运用DEBUG调试工具完成本实验6.2节要求的程序设计和调试
6.实验指导
6.1调试工具DEBUG简介
DEBUG是DOS操作系统为汇编语言程序设计者和系统管理员提供的一个通用调试工具,利用DEBUG可以读写、传送、比较、查找和显示存储器单元内容,设置程序起始执行地址或断点,执行程序或分段执行程序,跟踪程序执行,显示处理器状态,汇编或反汇编程序等。
用DEBUG编程简单、方便和直观,可以直接查看程序执行情况,便于熟悉和理解指令,掌握基本编程技巧。
DEBUG只使用十六进制表示数据(十六进制数后不加“H”),屏幕的显示数据形式如下:
1400:
010024656E64730D0A20-20636F6465202024*ends..code*
1400:
01107365676D656E740D-0A20202020202024segment..*
1400:
01702461782c300D0A09-2020202070757368*ax,0push
屏幕每行显示内容分为三部分,一行共显示十六个字节单元的内容。
第一部分是本行所显示的16个字节数据在存储器中的起始存放地址;第二部分是以十六进制显示的16个字节数据;第三部分是将本行所显示字节数据看作ASCII码时显示的字符,若某字节数据对应不可显示的ASCII码,则显示一个“.”字符代替该字节数据的显示字符。
DEBUG只有十几条单字母命令,功能强且易掌握,常用DEBUG命令如下:
1)DEBUG的进入和退出
进入DEBUG时,如果要同时装入某程序,键入下面的命令:
H:
>DEBUG<文件名>[<参数>]
其中文件名指定要装入的程序目标码文件,其扩展名可以是.COM或.EXE。
<参数>是由被装入程序接收的参数。
此外,也可以用下面的方式进入DEBUG:
H:
>DEBUG
-
“-”是DEBUG的命令提示符,表明已进入DEBUG状态。
在“-”提示符之后,可以键入DEBUG命令。
退出DEBUG时,键入如下命令从DEBUG状态返回DOS:
-Q
2)汇编与反汇编命令
汇编命令A和反汇编命令U是常使用的DEBUG命令。
①汇编命令A
格式:
A[<起始地址>]
功能:
逐行汇编程序,主要用于小段程序的汇编。
说明:
使用A命令汇编程序,不允许程序中出现标号和伪指令,但MS-DOS的DEBUG允许使用DB和DW这两条伪指令。
如果未给出起始地址,汇编后的程序代码从指令指针寄存器IP的值指定的地址开始存放。
按两次回车键可退出汇编命令A的状态。
例1-1汇编一段程序,该程序的功能是在屏幕上输出一个大写字母A。
-A100
1141:
0100MOVDL,41
1141:
0102MOVAH,02
1141:
0104INT21
1141:
0106INT20
②反汇编命令U
格式:
U[<地址范围>]
功能:
在指定的地址范围内,将二进制机器指令逐条翻译为汇编语言符号指令。
例1-2将例1-1中汇编的程序进行反汇编
-U100107
1141:
0100B241MOVDL,41
1141:
0102B402MOVAH,02
1141:
0104CD21INT21
1141:
0106CD20INT20
3)执行程序命令
在DEBUG下,可以完整地执行程序、分段执行程序或单步执行程序。
①执行程序命令G
格式:
G[=<程序起始地址>][<断点>…]
功能:
完整地或分段执行程序。
说明:
G命令可以从头至尾完整地执行程序,如果G命令带有有断点参数,则执行到断点地址时暂停并显示当前各寄存器状态,断点最多允许设置100个。
程序正常结束时显示“Programterminatednormally”。
例1-3执行例1-1中汇编的程序。
-G=100
A
Programterminatednormally
②跟踪执行命令P和T
格式:
P[=<地址>][<跟踪条数>]
T[=<地址>][<跟踪条数>]
功能:
跟踪命令P和T可以逐条跟踪指令的执行,以便调试程序。
说明:
每条指令执行后都将显示各寄存器的当前值。
P命令与T命令的差别是,P命令按程序书写的指令为单位,一次跟踪完一条书写指令(执行一组相关的指令),而T命令按存储单元中存放的指令为单位,一次跟踪一条指令的执行。
例1-4用P命令跟踪例1-1中的程序。
设程序执行前的各寄存器初值如下,然后开始用P命令跟踪例1-1程序:
AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=1141ES=1141SS=1141CS=1141IP=0100NVUPEIPLNZNAPONC
1141:
0100B241MOVDL,41
-P=100
AX=0000BX=0000CX=0000DX=0041SP=FFEEBP=0000SI=0000DI=0000
DS=1141ES=1141SS=1141CS=1141IP=0102NVUPEIPLNZNAPONC
1141:
0102B402MOVAH,02
-P
AX=0200BX=0000CX=0000DX=0041SP=FFEEBP=0000SI=0000DI=0000
DS=1141ES=1141SS=1141CS=1141IP=0104NVUPEIPLNZNAPONC
1141:
0104CD21INT21
-P
A
AX=0241BX=0000CX=0000DX=0041SP=FFEEBP=0000SI=0000DI=0000
DS=1141ES=1141SS=1141CS=1141IP=0106NVUPEIPLNZNAPONC
1141:
0106CD20INT20
-P
Programterminatednormally
用P命令只需跟踪执行4次,程序就执行完毕。
如果用T命令逐条指令跟踪执行,则将跟踪进入DOS功能调用的软中断服务程序中。
4)显示寄存器命令R
格式:
R[<寄存器>]
功能:
显示或修改寄存器内容。
说明:
当R命令后面不指定寄存器时,显示所有寄存器的内容。
例1-5显示所有寄存器内容
-R
AX=0100XB=0000CX=2000DX=00000SP=FFEEBP=0000SI=0000DI=0000
DS=07E1ES=07E1SS=07E1CS=07E1IP=0114NVUPDIPLNZNAPONC
例1-6修改寄存器内容
要修改某寄存器内容,可在R命令后键入寄存器名,DEBUG将显示出这个寄存器的值,然后键入新值就可修改该寄存器内容。
例如修改AX寄存器的内容:
-RAX
AX4500
:
3000
用RF命令可显示和修改标志寄存器FR中的标志位,无论修改哪一位标志位,只需要键入该标志位的表示符号(各标志位的符号表示如表1.1所示),并且标志位值的键入顺序可任意。
例1-7修改FR寄存器的零标志位和进位标志位。
-RF
NVUPEIPLZRNAPECY-NZNC(修改零标志和进位标志)
-RF
NVUPEIPLNZNAPENC-(显示修改结果)
表1.1标志寄存器各标志位符号及意义
标志位
符号表示
=1
=0
OF
溢出(是/否)
OV
NV
DF
方向(减/增)
DN
UP
IF
中断(开/关)
EI
DI
SF
符号(负/正)
NG
PL
ZF
零(是/否)
ZR
NZ
AF
辅助进位(是/否)
AC
NA
PF
奇偶(偶/奇)
PE
PO
CF
进位(是/否)
CY
NC
5)存储器单元访问命令
①显示存储器单元命令D
格式:
D[<地址范围>]
功能:
显示指定地址范围内的存储区数据,包括十六进制数据形式及其对应的ASCII码字符显示。
例1-8显示110H到116H存储器单元的内容。
-D110116
1540:
01107365676D656E74segment
②写存储器单元命令E
格式:
E<地址>[<字符串>]
功能:
逐个修改指定单元内容或将字节串写入指定的一组连续单元。
例1-9将字节串string写入以142H为起始地址的存储器区。
-E142string
例1-10逐个单元向彩显视频缓冲区写入41H、42H、41H、42H,彩显视频缓冲区的段地址为B800H,数据写入后立即显示出大写的ABAB。
-EB800:
70
B800:
007030.4107.0030.4207.0030.4107.f030.4207.f0
B800:
007820.
注意,“.”前为存储器单元原内容,“.”后为键入的数据,按空格键继续修改下一个存储器单元。
例中前两个AB为正常显示,后两个AB为反相、闪烁显示。
③填充命令F
格式:
F<地址范围><要填入的字节或字节串>
功能:
在指定地址范围内写入数据。
例1-11联用R命令和F命令在彩显视频缓冲区中写入一串小写字母a。
-RDS(修改DS,使DS指向彩显缓冲区B8000H)
DS0000
:
B800
-F0000005061(在0到50H单元内填满a)
6)其他命令
除以上常用命令外,DEBUG还提供了存储区数据比较命令C、数据查找命令S、数据移动命令M和十六进制数运算命令H等。
表1.2列出了DEBUG的全部命令以便于查阅。
表1.2DEBUG命令表
命令及其功能
格式
A(Assemble)汇编源程序
A[<地址>]
U(Unassemble)对二进制指令代码进行反汇编
U[<地址范围>]
T(Trace)跟踪执行程序并显示寄存器内容
T[=<地址>][<跟踪条数>]
P(Proceed)跟踪执行一组相关的指令
P[=<地址>][<跟踪条数>]
D(Dump)显示存储区数据
D[<地址>]或D[<地址范围>]
E(Enter)修改存储区数据
E<地址>[<字符串>]
F(Fill)将成组数据填入存储区
F<地址范围><要填入的字节或字节串>
G(Go)运行程序
G[=<起始地址>][<断点地址>…]
R(Register)显示和修改寄存器内容
R[<寄存器>]
N(Name)定义文件名
N<文件名>[<文件名>…]
L(Load)装入文件或磁盘扇区
L[<地址>][<盘符><相对扇区号><扇区数>]
W(Write)写文件或写磁盘扇区
W[<地址>[<盘符><相对扇区号><扇区数>]]
M(Move)传送存储区数据块
M<源地址范围><目的地址>
I(Input)读/显示端口
I<端口号>
O(Output)输出数据到端口
O<端口号><字节>
H(Hexarithmetic)十六进制加减法运算
H<数值><数值>
C(Compare)比较存储区数据
C<源地址范围><目的地址>
S(Search)检索字节或字符串
S<地址范围><要检索的字节或字节串>
Q(Quit)退出DEBUG
Q
6.2实验题
(1)下面的例子可用于调试程序的实验,并且作为几个常用DOS系统功能调用的示范。
①将大写字母A转换为小写字母a
-A200
MOVDL,41;A->DL
ORDL,20;A->a
MOVAH,2;功能号->AH
INT21;调用DOS功能调用2号功能,显示一个字符
INT20;退出程序执行,返回DOS
-G=200
思考并尝试修改程序,实现如下功能:
将大写字母B转换为小写字母b。
②从键盘输入一个字符并回显
-A220
MOVAH,1;功能号->AH
INT21;调用DOS功能调用1号功能,从键盘接收一个字符
MOVDL,AL;将接收的字符送DL,准备显示
MOVAH,2;功能号->AH
INT21;调用DOS功能调用2号功能,显示一个字符
INT20;退出程序执行,返回DOS
-G=220
③显示字符串
-E120‘Howdoyoudo?
$’
-A100
MOVDX,120;待显示的字符串地址->DX
MOVAH,9;功能号->AH
INT21;调用DOS功能调用9号功能,显示一个字符串
INT20;退出程序执行,返回DOS
-G=100
思考并尝试修改程序:
如果将字符串存放在300H开始的存储区,应该怎样修改程序?
(2)从BX所指的内存单元开始连续存放着两个字数据(被减数和减数),按寄存器间接寻址方式写出指令序列,取得被减数和减数,求两数之差,并将差存放于减数之后。
要求计算:
①3580H-3000H②3-5
提示:
先用DEBUG的E命令将被减数和减数写入内存某一块存储区(例如以200H为起始地址的存储区),然后在A命令状态下写程序,将数据存储区地址(200H)送入BX寄存器,利用寄存器间接寻址方式访问存储单元中的被减数和减数,再计算差和存放差。
思考并动手尝试:
如何查看程序执行结果?
(3)要求使用串操作指令编写一程序段,先将以400H为起始地址的存储区(40个字节单元)初始化为空格,然后将以500H为起始地址的存储区中的15个字符,传送到以400H为起始地址的存储区中。
(4)利用DEBUG的调试功能,体会、熟悉和掌握指令系统常用指令的使用方法及功能。
实验二汇编语言上机过程
1.实验目的
综合应用指令与伪指令编写简单完整的宏汇编语言程序,掌握常用的运算符、伪指令及宏汇编语言程序的结构,理解内存分段管理的方法和原理,熟悉调试宏汇编语言程序的上机过程及方法,掌握基本的循环程序设计方法。
2.实验内容
使用汇编程序ML(或MASM)、连接程序LINK及DEBUG调试简单的宏汇编语言程序,综合应用指令完成基本的循环程序设计。
3.实验要求
综合应用指令与伪指令编写简单完整的宏汇编语言程序,并熟悉汇编、连接及调试的方法和过程,完成实现简单功能的循环程序。
4.重点
掌握常用运算符和伪指令的功能与用法,能正确地编写分段结构的宏汇编语言程序。
5.实验结果验收
(1)编写四段结构和二段结构的宏汇编语言程序并调试成功
(2)编写具有一定实用功能的循环程序并输出程序执行结果
6.实验指导
6.1上机步骤
编辑、汇编、连接、运行汇编语言程序的步骤如下:
1)编辑源程序文件
用EDIT或者任何一种文本编辑工具(如UltraEdit32等)建立源程序文件,注意汇编语言程序源文件扩展名必须是“.ASM”。
例如,用EDIT建立源程序文件FILE.ASM的命令如下:
H:
>EDITFILE.ASM
执行上述命令将出现一个编辑窗口,在此窗口内进行源程序编辑。
按“Alt”键可以下拉出菜单选择需要的操作功能。
按热键“X”,再按“Enter”键,将保存源文件并退出EDIT编辑窗口。
2)汇编源程序
①用MASM5.X版汇编程序进行汇编
H:
>MASMFILE
Microsoft(R)MacroAssemblerVersion5.01
Copyright(C)MicrosoftCorp1981-1985,1987.Allrightreserved.
Objectfilename[FILE.OBJ]:
SourceListing[NUL.LST]:
crossreference[NUL.CRF]:
0WarningErrors
0SeverErrors
②用MASM6.X版汇编程序进行汇编
H:
>ML/cFILE.ASM(只产生目标文件,不进行连接)
或
H:
>MLFILE(产生目标文件并自动进行连接,产生可执行文件)
汇编无错后,可进行目标文件的连接。
2)连接
H:
>LINKFILE
Microsoft(R)OverlayLinkerVersion5.03
Copyright(C)MicrosoftCorp1983-1987.Allrightreserved.
RunFile[FILE.EXE]:
ListFile[FILE.MAP]:
Libraries[.LIB]:
DefinitionsFile[NUL.DEF]:
3)运行程序
H:
>FILE
6.2四段结构的宏汇编语言程序示例
(1)完整的段定义
例2-1下面是一个简单的汇编语言源程序,该程序以完整的段定义格式定义了数据段、附加段、堆栈段和代码段,功能是完成字符串传送,将40个星号“*”从数据段传送到附加段。
datasegment;定义数据段
sbufferdb40dup(*)
dataends;数据段结束
extrasegment;定义附加段
dbufferdb40dup(?
)
extraends;附加段结束
stacksegmentparastack‘stack’;定义堆栈段
db100dup(0)
stackends;堆栈段结束
codesegment;定义代码段
mainprocfar;定义主过程开始
assumecs:
code,ds:
data,es:
extra,ss:
stack
start:
movax,data;设置数据段地址,初始化DS段寄存器
movds,ax
movax,extra;设置附加段地址,初始化ES段寄存器
moves,ax
leasi,sbuffer;源字符串存储区首址送SI寄存器
leadi,dbuffer;目的存储区首址送DI寄存器
cld;设置方向标志(DF=0)
movcx,40;源字符串长度送CX寄存器
repmovsb;字符串传送
movax,4c00h;返回DOS
int21h
mainendp;主过程结束
codeends;代码段结束
endstart;源程序结束
(2)简化的段定义
例2-2下面是例2-1源程序的简化段定义格式。
.modelsmall;定义存储模式
.data;定义数据段
sbufferdb40dup(*)
.data?
;定义data?
数据段
dbufferdb40dup(?
)
.stack100;定义堆栈段(100字节)
.code;定义代码段
.startup;定义程序起始点
movax,@data;设置附加段地址,初始化ES段寄存器
moves,ax
leasi,sbuffer;源字符串存储区首址送SI寄存器
leadi,dbuffer;目的存储区首址送DI寄存器
cld;设置方向标志(DF=0)
movcx,40;源字符串长度送CX寄存器
repmovsb;字符串传送
.exit0;返回DOS
end;源程序结束
(3)汇编(同时产生列表文件)、连接并运行
将上述简化段定义源程序建立为源文件stars40.asm后,汇编命令如下:
H:
>ML/c/Fl/Sgstars40.asm
上述命令将产生目标文件stars40.obj和列表文件stars40.lst。
其中选项/c要求只汇编不连接,选项/Fl要求产生列表文件,选项/Sg要求在列表文件中列出由汇编程序根据伪指令所产生的机器指令。
对stars40.obj文件进行连接,产生可执行文件stars40.exe,连接命令如下:
H:
>LINKstars40
运行可执行文件stars40.exe,命令如下:
H:
>stars40
(4)用DEBUG调试和分析stars40.asm程序
①进入DEBUG时装入stars40.exe程序,如图2.1所示,执行命令:
debugstars40.exe。
图2.1进入DEBUG并装入stars