基于32位的 微机原理与接口技术实验指导书新版.docx
《基于32位的 微机原理与接口技术实验指导书新版.docx》由会员分享,可在线阅读,更多相关《基于32位的 微机原理与接口技术实验指导书新版.docx(62页珍藏版)》请在冰豆网上搜索。
基于32位的微机原理与接口技术实验指导书新版
微机原理与接口技术
实验指导书
授课教师:
王春武
(内部资料)
目录
第一部分debug命令1
DEBUG的命令及功能如下:
2
A[地址]汇编命令2
C[源地址范围][目的地址]比较命令3
转储命令D3
修改内存命令E[地址][字节串)4
F[地址范围][字节或字节串]填写命令4
*G[=起始地址][[断点]……]执行命令5
*I[端口地址]5
*L[地址][盘号:
][逻辑扇区号][扇区数]5
*M[地址范围][起始地址]数据传送命令6
*N[盘号:
][路径][文件名][扩展名]6
*O[端口地址][数据]输出命令7
*P[=地址][数据]进程命令7
*Q退出命令。
7
*R[寄存器]寄存器命令7
*S[地址范围][字符串]8
*T[=地址][指令条数]跟踪命令8
*U[起始地址]或者[地址范围]9
*W写盘命令9
debug命令实际应用10
第二部分DOS系统功能调用1
第三部分32位实验9
实验一、IO宏调用9
实验二、熟悉MASMPlus编程环境10
实验三、顺序程序设计12
实验四、分支程序设计13
实验五、循环程序设计15
实验六、子程序设计和宏17
实验七、综合实验19
实验八、8253发声控制实验23
第四部分常用IO子程序名称表25
宏名25
子程序名25
功能25
WriteString25
DISPMSG25
入口参数:
EAX=字符串地址。
功能:
输出以0结尾的字符串。
25
WriteChar25
DISPC25
入口参数:
AL=字符ASCII码功能:
显示一个字符25
WriteCrlf25
DISPCRLF25
功能输出一个回车25
WriteRegDword25
DISPRD25
功能:
显示8个32位寄存器的内容25
WriteFlags25
DISPRF25
功能:
显示6个状态寄存器25
WriteHexDword25
DISPHD25
入口参数:
EAX=32位数。
功能:
以16进制显示数据。
25
WriteUDecDword25
DISPUID25
入口参数:
EAX=32位数。
功能:
以无符号十进制显示数据。
25
WriteSDecDword25
DISPID25
入口参数:
EAX=32位数。
功能:
以有符号十进制显示数据。
25
ReadString25
READMSG25
入口参数:
EAX缓冲区地址。
功能:
输入字符串。
25
ReadChar25
READC25
出口参数:
AL=字符ASCII码功能:
输入一个字符25
ReadHexDword25
READHD25
入口参数:
EAX=字符串地址。
功能:
以16进制输入数据。
25
ReadUDecDword25
READUID25
入口参数:
EAX=字符串地址。
功能:
以无符号十进制输入数据。
25
ReadSDecDword25
READSID25
入口参数:
EAX=字符串地址。
功能:
以有符号十进制输入数据。
25
第一部分debug命令
DEBUG是DOS操作系统支持的一种系统软件,是MS公司献给用户的一个通用软件工具,主要用于8088/8086汇编语言程序的调试.它不仅为用户和系统管理员提供了一个可控制的程序调试与开发环境,以便动态地监视管理被调试程序的执行,帮助人们查出程序在逻辑功能上的深层次错误和不完善地方,验证程序的正确性.还为我们提供了一个观察研究窗口,为分析、解剖、开发程序提供了有力的实验手段。
因此,熟练地掌握DEBUG的使用很必要也很重要.
介绍下列几种常用DEBUG命令的功能及使用格式:
子命令及其功能
命令格式
Assemble
——对指令语句进行汇编
A[(地址)]
Dump
——显示内存单元内容
D[(地址或地址范围)]
Enter
——显示和修改存储单元内容
E[(地址
字符串)]
Fill
——
向内存区填充数值或字符代码
F[(地址
字符串)]
Load
——
装载文件或扇区数据
L[(地址)]
Perform
——单步执行
P[(地址)]
Register
——
显示修改寄存器及标志位
R[(寄存器名)]
Go
——运行调试的程序
G[(始地址
断点地址)]
Trace
——
跟踪执行单条或多条指令
T[(地址
条数)]
Uasemble
——对指令代码反汇编
U[(地址)]
Quit
——返回D0S
Q
DEBUG命令介绍
它的功能包括以下几个方面。
1.直接输入,更改,跟踪,运行汇编语言源程序;
2.观察操作系统的内容;
3.查看ROMBIOS的内容;
4.观察更改RAM内部的设置值;
5.以扇区或文件的方式读写软盘数据
DEBUG把所有数据都作为字节序列处理。
因此它可以读任何类型的文件。
DEBUG可以识别两种数据:
十六进制数据和ASCⅡ码字符。
它的显示格式是各个字节的十六进制值以及值在32与126之间的字节的相应ASCⅡ码字符。
在DEBUG中输入数据有两种方法:
提示方法和非提示方法。
在用提示方法时,用户可以输入要求输入数据的命令,后跟数据所要输入的地址。
然后用户就可以看到该地之中已有内容及一个冒号提示符。
此时用户可以在提示符下输入一个新的值或者按下回车键或CTRL+C回到短横(-)提示符。
在运用非提示方法时,用户可以输入要输入数据的内存地址以及要输入的字节。
但与使用字处理程序或正文编辑程序时不一样,在使用DEBUG时,用户不能直接移动光标到一入口点输入或修改数据,而要一次输入一个或几个字节。
在使用DEBUG时可以只涉及内存中的数据,从而一般都要指定所要处理的内存地址,地址的输入格式是:
[段地址]:
[位移]。
如果没有输入地址,DEBUG将假定为当前内存段,从位于地址100H的字节开始。
前100H字节保留给程序段前缀使用,这一专用区域用于建立DOS与程序之间的联系。
DEBUG总是用四位十六进制数表示地址。
用两位数表示十六进制数据。
讲到这里大家应该对DEBUG有了初步的了解,但是光知道这些可不够,接下来我来讲讲DEBUG的命令格式和命令。
当输入
DEBUG
调用了DEBUG程序,就会出现一个短横提示符,用户就可以在这一短横后输入DEBUG程序的命令。
有些DEBUG命令会显示一个内存地址并产生一个作为提示符的冒号。
在这些提示符后,用户可以输入一个新值以改变所显示位置原来的值。
如果用户不输入一个新值而是按下回车或CTRL+C,那么原来的值不会改变。
一般用不着把地址和命令名字分开。
例如,用转储命令D察看100号地址的数据,那么这个命令可以用以下任一种形势输入:
D100
D100
D。
100
D,100
如果输入的命令中出现了错误,DEBUG将在下一行对着错误的位置标记出来,例如:
-s100d12
^Error
DEBUG的命令及功能如下:
A[地址]汇编命令
功能:
将指令直接汇编成机器码输入到内存中。
说明:
用于小段程序的汇编及修改目标程序,所有输入的数字均采用十六进制,用户装入内存的汇编语句是连续存放的,若没有指定地址,并且前面没有使用汇编命令,改语句被汇编到CS:
0100区域。
例A:
>DEBUG
-a0100
08F1:
0100MOVAH,09
08F1:
0102MOVDX,109
08F1:
0105INT21H;
08F1:
0107INT21H;<-XP下运行cmddebug时,应该是INT20H,21H会出遇无效指令错误
08F1:
0109db'MayIhelpyou$'
08F1:
0115←离开a状态
-g=100109←运行
MayIhelpyou运行结果
Programterminatednormally表示运行正常
C[源地址范围][目的地址]比较命令
功能:
比较两内存区域中的内容是否相同,若不同则显示其地址和内容。
C源起始地址个数目的起始地址
如:
C0410
就是用来比较4000:
0000与DS:
0100两段地址中的3F个单元的内容:
其显示格式如下:
例:
比较4000:
03F100内容的差异
-C4000:
03F100
4000:
0000644308F1:
0100
4000:
00013E6908F1:
0101显示内容的差异处
4000:
000278FF08F1:
0102
……………………………………
如果要比较的范围在DS内,则段地址不必指出:
如:
-C04100;比较DS:
0---DS:
4与DS:
100---DS:
104
C命令的另一种格式如下:
C地址1L长度地址2
如:
-C000:
0L40;由0000:
0与与DS:
0开始比较它同-C0000:
030命令相等,显示结果如下:
0000:
00008AC008F1:
0000
0000:
0001102008F1:
0001它们都比较4个字节
0000:
00021C0008F1:
0002
0000:
0003497F08F1:
0003
D转储命令
D[地址]或D[起始地址][目的地址]转储命令
功能:
以内存映象方式显示内存中的信息。
说明:
转储用左右两部分显示内存映象内容,左边以十六进制,右边以ASCII字符显示,所有不可打印字符用句号.表示。
每行显示16个字节的内容,在第八和第九个字节之间有一个连字符-此命令隐含的段地址为DS的值。
若未指定起始地址,则D命令从显示的最后一个单元的下一个单元开始显示,若以前没有使用给D命令,则从初使化的段寄存器的内容,加上地址偏移量0100H开始显示。
例:
-d104f即为显示DS:
4f的内容在D命令中如不指出段地址,则其默认为DS段。
如指明段地址,则从指明的段地址列出指定的范围
如:
-dfff:
000f
我们也可以指定长度来列出所需要内存内容
如:
-d100L20即为显示由DS:
100-DS:
11F的内容,共20H个字节:
E[地址][字节串)修改内存命令
功能:
从指定的地址开始修改内存值。
格式:
E起始地址[数据行]
(1)用给定内容代替指定范围的单元内容
-E地址内容表
例:
-E1004142434448474645
-D100L08
08F1:
01004142434448474645ABCDHGFE…
(2)逐个内存内容
例:
-E100:
08F1:
01007642:
42是操作员键入
此命令是将原100号内存内容76修改为42,用D命令可察看。
F[地址范围][字节或字节串]填写命令
功能:
将要填写的字节或字节串填入由地址范围指定的存储器中。
例:
-f10012061626364
-d10011f
08F1:
01006162636461626364-61626364616263abcdabcdabcdabcd
08F1:
0110136798E3C82EB3B6-0321AC1931214E96g……1…
如果数据行超出指定的范围,则填不下的数值会被忽略。
例:
-f1001074143434445464748494A4B4C4D-d100,lof
08F1:
01004142434445464764-61626364ABCDEFGdabcdabcd
由上例可看出,超出范围的数据被忽略
另外,F和E命令都可填入字符串:
如:
-F100105"MSDOS"
-d100l0f
08F1:
01004D53444F53464764-61626364MSDOSFGabcdabcd
G[=起始地址][[断点]……]执行命令
功能:
执行正在调试的程序,当达到断点时停止执行,并且显示寄存器标志和下一条要执行的命令。
说明:
如果没有指定起始地址,那么当前指令地址由CS:
IP寄存器的内容来决定,如果用户指定起始地址就从指定的起始地址开始执行。
如果指定断点,当指令到达指令地址时停止执行,并显示各寄存器标志位的内容和下一条要执行的命令,最多允许用户设定10个断点。
例:
A:
\>debugtan.exe
-u:
反编译成汇编语言程码
…………
..
-g100指定中断点
Programterminatednormally:
另外:
我们在DEBUG下可运行一个文件.EXE
如:
A:
\>debugtan.exe
-g
即可开始运行此程序,和在DOS下完全一样:
*H[数值][数值]十六进制算术运算命令
功能:
分别显示两个十六进制数相加的和以及第一个数减去第二个数的差。
说明:
替用户完成简单的十六进制数的运算。
例:
-h45385623
9B5BEF15
I[端口地址]
功能:
从指定的端口输入并显示(用十六进制)的一个字节。
例:
-I70
F9;显示70端口的内容为F9
I命令可由80X86的64K个端口取数据
L[地址][盘号:
][逻辑扇区号][扇区数]
功能:
将一个文件或盘的绝对扇区装入存储器。
说明:
单个L命令能够装入的最大扇区数是80H,其中盘号0,1,2,3……分别代表A,B,C,……出现读盘错,显示错误信息。
(1)格式1:
L装入地址驱动器名起始扇区/扇区数
这种方式可把磁盘上指定扇区范围的内容装入到存储器从指定地址开始的区域中,在此外扇区编号引用逻辑/扇区的方式。
例:
-L100001,将A驱的0扇区装至CS:
100上
-d10010f
08F1:
0100EB3C903C53444F53-362E323202010100.L,MSDOS6.22……
(2)格式2:
L装入地址
这种方式可把指定文件装入内存,装入的文件可在进入DEBUG时指定亦可用N命令建立,格式为-n文件名:
例1DEBUGtan.pas
-L100
例2DEBUG
-ntan.pas
-L100
须知:
L命令只能读取逻辑扇区,不能读取硬盘分区表
L命令中所用的磁盘代码A=00,B=01,C=02……
M[地址范围][起始地址]数据传送命令
功能:
把地址范围内的存储器单元的内容移到起始地址的指定地址中
说明:
传送期间,源区和目标区可以部分重叠;传送后源区域数据保持不变。
例:
-e1004142434445
-d10010f
08F1:
0100414243444562626364-6162636461626364ABCDEBCDABCDABCD
-M100104110
-d110L1F
08F1:
0100414243450A2119-200101200796879FABCDE……
N[盘号:
][路径][文件名][扩展名]
功能:
定义操作文件名。
说明:
可同时定义两个操作文件,并将形成的文件控制块相应的设置在内存CS:
5C和CS:
6C上,供以后的L和W命令操作之用。
我们在运行程序侦错时,在启动DEBUG时在其后加文件程序名以及该程序的参数或运行文件,但当我们侦错一段后,可能装入其它文件来测试,这时我们可利用N命令来设置而无需退出DEBUG。
例:
A:
\>DEBUGtan.exe
-nyoug.pas
当程序侦错一段时间后,若要把tan.exe装入tan1.pas则-ntanl.pas
O[端口地址][数据]输出命令
功能:
发送字节到指定的输出端口。
例:
当我们遇到开机要求输入口令时,可用如下方式取消
-O7010
_O7100
P[=地址][数据]进程命令
功能:
将一个子程序调用指令,循环指令,中断指令或一个重复字符串指令,停止在下一条指令上。
说明:
在执行一条子程序调用指令,循环指令,中断指令或一个重复字符串指令时,发出P命令去执行有关指令,并且返回到要执行的下一条指令。
P命令和T一样选用来跟踪程序运行过程用的命令,我们可以在P命令中指定程序运行的起始地址,指令个数,如未指定则CS:
IP所指定程序的地址开始一次运行一条令。
P与T命令的差别在于P命令把CALL/INT当成一条指令来执行,简化了跟踪过程,P命令只运行RAM内存的命令,而T命令则可运行RAM和ROM里的程序。
Q退出命令。
R[寄存器]寄存器命令
功能:
一,显示单个寄存器的内容,并提供修改功能。
二,显示所有寄存器内容,再加上字母标志位状态以及要执行的下一条指令。
三,显示8个标志位状态,并提供修改功能。
若不想改变则回车即可。
例:
-rbx
bx0050
:
51
-r
AX=0000BX=0051CX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0003ES=0CD3SS=0CD3IP=0100NVUPEIPLNZNAOPNC
0CD3:
01000FDBOF
若想改变标志寄存器,用-RF回车,则DEBUG会将标志内容显示出来,若想改变任一标志,只要输入该标志的名称即可。
标志名称设置未设置标志名称设置未设置
滋出OV(未溢出)NV(未溢出)零位ZRNZ(不等于零)
方向DN(减少)UP(增加)辅助进位ACNA(无进位)
中断EI(许可)DI(禁止)奇偶标志PE(偶)PO(奇)
符号NG(负)PL(正)进位CYNC(清除进位)
例:
-Rf
NVUPEIPLNZNAPONC:
-OVDI←输入值
S[地址范围][字符串]
功能:
在指定的地址范围内查找给定的字符串。
说明:
用来指定在地址范围内查找一个字符串,若找到则显示其地址,否则直接显示DEBUG提示符。
隐含地址为DS段值。
在此内存可以用(起始地址)(终止地址)或(起始地址)L(长度)的方式来表示,而字符串与数据行则可混合使用:
如:
02.76"BC"。
例:
-d100lof
08F1:
0100OF2A41430B314296-FFF0B98AF300B1..AC,1B...
-S100L0f"AC"
08F1:
0102←表示找到,由0102开始,
T[=地址][指令条数]跟踪命令
功能:
逐条跟踪程序的执行,每条指令执行后都将显示各寄存器的内容。
说明:
通常采用跟踪一条指令,但用户也可以用指令条数设定一次跟踪多条指令,每执行一条指令之后,显示所有寄存器的内容和标志状态。
逐条指令跟踪-T[=起始地址]
从指定地址起执行一条指令后停下来,显示所有寄存器内容及标志位的值,如来指定地址则从当前CS:
IP开始执行。
A:
\>DEBUG
-A
08F1:
0100MOVDL,03H
08F1:
0102MOVAH,02H
08F1:
0104INT21H
08F1:
0106INT20H
08F1:
0108
-T
AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=08F1ES=08F1SS=08F1CS=08F11P=0105NVUPEIPLNZPOCY
09F1:
0102B402MOVAH,02
若指定起始地址,则T命令会从指定的地址开始跟踪,我们还可以指定跟踪一次所运行指令的个数,用Ctrl+S暂停屏幕的显示,以便观察。
-t=10010;由CS:
100开始跟踪10条指令
U[起始地址]或者[地址范围]
功能:
将内存中的内容转换为汇编语句。
说明:
反汇编的字节数取决与用户的系统显示形式,以及在U命令中使用的可选项。
(1)从指定地址开始编译,反汇编32个字节
-U[地址]←从CS:
100开始,其反汇编32个字节
如果地址被省略,则从一个U命令的最后一条指令的下一条单元开始汇编32个字节。
(2)对指定的存贮范围进行反汇编
-u起始地址终止地址(L长度)
例:
-U100109
08F1:
0100CD20INT20
08F1:
0102FF9F009ACALLFA12[BX+9A00]
08F1:
0106F0LOCK
08F1:
0107FE1DCALLFAR[DI]
08F1:
0109F0LOCK
说明:
如指定了范围则整个范围全都会被反编译
W写盘命令
*W[地址][盘符:
][起始扇区][扇区数]写盘命令
功能:
将修改过的数据写到磁盘上。
说明:
可以将指定内存地址开始的数据写在磁盘上,可以在没有指定参数,或指定地址参数的情况下,将调试文件写在磁盘上。
在运行W时需设置文件的大小CX或BX寄存器
(1)把数据写入磁盘的指定扇区
-W起始地址驱动器名起始扇区扇区数
(2)把数据写入指定文件中
-W起始地址
例A:
\>DEBUG
-A
08f1:
0100....
.写入程序段
08F1:
012A....
-RCX
CX:
0000
:
2A←写入字节数,即为程序结尾地址减起始地址
-n←设置文件名,需后缀为com
-w
Wring002Abytes