《微机原理及应用》实验指导书1129要点Word格式.docx
《《微机原理及应用》实验指导书1129要点Word格式.docx》由会员分享,可在线阅读,更多相关《《微机原理及应用》实验指导书1129要点Word格式.docx(26页珍藏版)》请在冰豆网上搜索。
这些软件在DOS环境运行,学生可以采用命令行的形式使用。
当然,现在也有运行在Windows系统的集成开发软件。
学生在掌握汇编过程的基础上,可以选用该类Windows环境的汇编集成开发软件。
2.1实验一调试程序debug.exe的使用
DEBUG是一个DOS实用程序,是供程序员使用的程序调试工具,可以用它检查内存中任何地方的字节以及修改任何地方的字节。
它可以用于逐指令执行某个程序以验证程序运行的正确性,也可以追踪执行过程、比较一个指令执行前后的值以及比较与移动内存中数据的范围,读写文件与磁盘扇区。
它的功能包括以下几个方面。
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命令会显示一个内存地址并产生一个作为提示符的冒号。
在这些提示符后,用户可以输入一个新值以改变所显示位置原来的值。
如果用户不输入一个新值而是按下回车或CTRL+C,那么原来的值不会改变。
一般用不着把地址和命令名字分开。
例如,用转储命令D察看100号地址的数据,那么这个命令可以用以下任一种形势输入:
D100
D100
如果输入的命令中出现了错误,DEBUG将在下一行对着错误的位置标记出来,例如:
-S100d12
^Error
DEBUG的命令及功能如下:
汇编命令:
A[地址];
ASSEMBLE
功能:
将指令直接汇编成机器码输入到内存中。
说明:
用于小段程序的汇编及修改目标程序,所有输入的数字均采用十六进制,用户装入内存的汇编语句是连续存放的,若没有指定地址,并且前面没有使用汇编命令,改语句被汇编到CS:
0100区域。
例A:
>
DEBUG
-a0100
08F1:
0100MOVAH,09
0102MOVDX,107
0105INT21H
0107db'
MayIhelpyou$'
0117←直接,回车,离开a状态
-g=100107←运行
MayIhelpyou;
运行结果
Programterminatednormally;
表示运行正常
(调试程序DEBUG如何表达标志状态?
溢出OV(overflow,OF=1)
无溢出NV(nooverflow,OF=0)
减量DN(directiondown,DF=1)
增量UP(directionup,DF=0)
允许中断EI(enableinterrupt,IF=1)
进制中断DI(disableinterrupt,IF=0)
负NG(negative,SF=1)
正PL(plus,SF=0)
零ZR(zero,ZF=1)
非零NZ(nozero,ZF=0)
辅助进位AC(auxiliarycarry,AF=1)
无辅助进位NA(noauxiliarycarry,AF=0)
偶校验PE(evenparity,PF=1)
奇校验PO(oddparity,PF=0)
进位CY(carry,CF=1)
无进位NC(nocarry,CF=0)
)
转储命令(数据显示):
Display
D[地址]或D[起始地址][截止地址]
以内存映象方式显示内存中的信息。
转储用左中右三部分显示内存映象内容,左面是内存地址(段地址:
偏移,表示后面的内存区16字节的首地址),中间以十六进制显示数据,右边以ASCII字符显示(所有不可打印字符用句号.表示)。
每行显示16个字节的内容,在第八和第九个字节之间有一个连字符-。
此命令隐含的段地址为DS的值。
若未指定起始地址,则D命令从上次显示的最后一个单元的下一个单元开始显示,若以前没有使用给D命令,则从初始化的段寄存器的内容,加上地址偏移量0100H开始显示。
例:
-d104f即为显示DS:
10—DS:
4f的内容。
在D命令中如不指出段地址,则其默认为DS段。
如指明段地址,则从指明的段地址列出指定的范围
如:
-dfff:
000f
我们也可以指定长度来列出所需要内存内容
-d100L20即为显示由DS:
100-DS:
11F的内容,共20H(32)个字节:
修改内存命令E[地址][字节串);
EDIT
从指定的地址开始修改内存值。
格式:
E起始地址[数据行]
(1)用给定内容代替指定范围的单元内容
-E地址内容表
-E1004142434448474645
-D100L08
显示:
01004142434448474645ABCDHGFE…
(2)逐个内存内容
-E100:
01007642;
42是操作员键入
此命令是将原100号内存内容76修改为42,用D命令可察看
F[地址范围][字节或字节串]填写命令FILL
将要填写的字节或字节串填入由地址范围指定的存储器中。
-f10011f61626364
-d10011f
08F1:
01006162636461626364-61626364616263abcdabcdabcdabcd
01106162636461626364-61626364616263abcdabcdabcdabcd
如果数据行超出指定的范围,则填不下的数值会被忽略。
-f1001074143434445464748494A4B4C4D
-d10010f
01004142434445464764-61626364ABCDEFGdabcdabcd
由上例可看出,超出范围的数据被忽略
另外,F和E命令都可填入字符串:
-F100105"
MSDOS"
-d100l0f
01004D53444F53464764-61626364MSDOSFGabcdabcd
执行命令:
G[=起始地址][[断点]……]
执行正在调试的程序,当达到断点时停止执行,并且显示寄存器标志和下一条要执行的命令。
如果没有指定起始地址,那么当前指令地址由CS:
IP寄存器的内容来决定,如果用户指定起始地址就从指定的起始地址开始执行。
如果指定断点,当指令到达指令地址时停止执行,并显示各寄存器标志位的内容和下一条要执行的命令,最多允许用户设定10个断点。
进程命令:
P[=地址][数据]procedure
将一个子程序调用指令,循环指令,中断指令或一个重复字符串指令,停止在下一条指令上。
在执行一条子程序调用指令,循环指令,中断指令或一个重复字符串指令时,发出P命令去执行有关指令,并且返回到要执行的下一条指令。
P命令和T一样选用来跟踪程序运行过程用的命令,我们可以在P命令中指定程序运行的起始地址,指令个数,如未指定,则从CS:
IP所指定程序的地址开始,一次运行一条指令。
P与T命令的差别在于P命令把CALL/INT当成一条指令来执行。
(调试INT21时区别就出来了。
R[寄存器]寄存器命令register
一、显示单个寄存器的内容,并提供修改功能
二、显示所有寄存器内容,再加上标志位状态以及要执行的下一条指令
三、显示8个标志位状态,并提供修改功能。
若不想改变则回车即可。
-rbx
bx0050:
51
-r
AX=0000BX=0051CX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0003ES=0CD3SS=0CD3IP=0100NVUPEIPLNZNAOPNC
0CD3:
01000FDBOF
若想改变标志寄存器,用-RF回车,则DEBUG会将标志内容显示出来。
若想改变任一标志,只要输入该标志的名称即可。
溢出OV(溢出)NV(未溢出)零位ZR(等于零)NZ(不等于零)
方向DN(减少)UP(增加)辅助进位ACNA(无进位)
中断EI(许可)DI(禁止)奇偶标志PE(偶)PO(奇)
符号NG(负)PL(正)进位CYNC(清除进位)
-Rf
NVUPEIPLNZNAPONC:
-OVDI←输入值
T[=地址][指令条数]跟踪命令trace
逐条跟踪程序的执行,每条指令执行后都将显示各寄存器的内容。
通常采用跟踪一条指令,但用户也可以用指令条数设定一次跟踪多条指令,每执行一条指令之后,显示所有寄存器的内容和标志状态。
逐条指令跟踪-T[=起始地址]
从指定地址起执行一条指令后停下来,显示所有寄存器内容及标志位的值,如来指定地址则从当前CS:
IP开始执行。
A:
-A
0100MOVDL,03
0102MOVAH,02
0104INT21H
0106INT20H;
退出指令
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[起始地址]或者[地址范围]unassembled
将内存中的内容转换为汇编语句。
反汇编的字节数取决与用户的系统显示形式,以及在U命令中使用的可选项。
(1)从指定地址开始编译,反汇编32个字节
-U[地址]←从CS:
100开始,其反汇编32个字节
如果地址被省略,则从一个U命令的最后一条指令的下一条单元开始汇编32个字节。
(2)对指定的存贮范围进行反汇编
-u起始地址终止地址(L长度)
-U100109
0100CD20INT20
0102FF9F009ACALLFA12[BX+9A00]
0106F0LOCK
0107FE1DCALLFAR[DI]
0109F0LOCK
说明:
如指定了范围则整个范围全都会被反编译
一、实验目的
掌握debug.exe功能,通过debug.exe练习并掌握汇编指令,可以调试简单的程序。
二、实验内容
DEBUG启动运行—打开—debug
DEBUG[盘符:
][路径][.扩展名][参数1][参数2]其中参数1、参数2是指定文件所带的参数。
例如:
DEBUGDISKCOPY.COMA:
B:
中的A:
和B:
即为参数。
进入DEBUG的提示符是符号‘-’。
用户可以通过DEBUG的名令输入汇编源程序,并用相应命令将其汇编为机器语言;
然后调试并运行该程序。
DEBUG命令
1.汇编命令A(Assemble)
(1)A<
段寄存器名>
:
<
位移量>
(2)A<
段地址>
(3)A<
(4)A
功能:
键人该命令后,显示段地址和位移并等待用户从键盘逐条键入汇编命令,逐条汇编成代码指令。
用户最后直接键人回车键返回到提示符“-”。
其中
(1)用指定段寄存器内容作段地址
(2)以<
内容作段地址(3)用CS内容作段地址(4)以CS:
10O作地址。
以后命令中提及的各种‘地址’形式,均指
(1)、
(2)、(3)中A后的地址形式。
2.比较命令C(compare)
格式:
C<
源地址范围>
,<
目标地址>
其中<
是由<
起始地址>
终止地址>
指出的一片连续单元,或<
L<
长度>
。
功能:
从<
的起始地址单元起逐个与目标起始地址以后的单元顺序比较单元的内容,直至源终止地址为止。
遇有不一致时,以<
源地址>
源内容>
目标内容>
的形式显示失配单元及内容c
3.显示内存命令D(display)
(1)D<
地址>
(2)D<
范围>
(3)D
以两种形式显示指定内存范围内容。
一种形式为十六进制内容,一种形式为相应字节的ASCII码字符,对不可见字符以‘.’代替。
其中(1、2)以CS为段寄存器。
(3)显示CS:
100起始的一片内容。
4.修改内存命令E(edit)
格式
(1)E<
单元内容>
(2)E<
单元内容表>
(3)E<
是一个十六进制数,或用引号′或″括起来的字符串;
是以‘空格’分隔的十六进制数,或用′或〃括起来的字符串,或者是二者的组合。
(1)将指定内容写人指定单元后显示下一地址,可连续键人修改内容,直至新地址出现后键人回车<
ENTER>
止。
(2)将<
逐一写人由<
开始的一片单元。
5.填充内存命令F(fill)
F<
将单元内容表中的值逐个填入指定范围,单元内容表中内容用完后重复使用。
例如:
-F100L10B2,’XYZ’,3C
-d100
6.执行命令G(go)
(1)G
(2)G=<
(3)G=<
断点>
(yk后面的断点实际上是末位地址)
(1)从CS:
P开始执行
(2)从指定地址开始执行
(3)从指定地址开始执行,到断点自动停止
7.十六进制算术运算指令H(hexarimathmetic)
H<
值1>
值2>
求十六进制数(值1〉和〈值2〉的和与差并显示结果。
8.端口输入命令I(in)
I<
口地址>
将从指定端口输人的内容显示出来。
9.读盘命令L(load)
L<
盘号>
起始逻辑扇区>
所读扇区个数n>
其中〈地址〉缺省值为CS:
10O。
逻辑扇区可由物理扇区号换算得到,以双面双密度盘为例:
物理扇区是按O面O道1区,O面O道2区,……O面O道9区,O面1道1区,……O面39道9区,1面O道1区,…1面39道9区排列。
而逻辑扇区与物理扇区号的对应关系为物理扇区O面O道1扇区至9扇区,逻辑扇区号为O~8;
物理扇区1面O道1扇区至9扇区,逻辑扇区号为9~11H;
物理扇区O面1道1扇区至9扇区,逻辑扇区号为12~1AH……这样每道先O面后1面一直排下去。
其中〈盘号〉为0、1或2,O表示A盘,1表示B盘,2表示硬盘。
将〈盘号〉指定的盘上,从〈起始逻辑扇区)起,共n个逻辑扇区上的所有字节顺序读人指定内存地址的一片连续单元。
当L后的参数缺省时,必须在L之前由N命令指定(或进入DEBUG时一并指出)所读盘文件名。
此时L执行后将该文件装人内存。
—NEXAMPLE
一L
将当前盘上的EXAMPLE文件装入CS:
lO0起始的一片内存单元。
10.内存搬家命令M(move)
M<
目标起始地址>
其中源及目标地址若仅输人偏移量,则隐含段为DS。
把〈源地址范围〉中的内容顺序搬至〈目标起始地址)起的一片连续单元。
MCS:
100110600
把从CS:
lOO起至CS:
110止17个字节搬至DS:
600至DS:
610的一片单元。
11.命名待读文件命令N(name)
N文件名说明
为L命令指定待装人文件
注:
其它形式参考DOS手册
12.端口输出命令0(output)
O<
端口地址>
字节>
将该<
从指定<
输出。
O2F4F
将4FH从2FH口输出
13.结束debug返回DOS命令Q(quit)
Q
14.显示寄存器命令R(register)
(1)R
(2)R<
寄存器名>
(1)显示当前所有寄存器内容、状态标志及将要执行的下一指令的地址、代码及汇编语句形式。
其中对状态标志FLAG以每位的形式显示,详见表
状态标志显示形式
标志位
状态
显示形式
溢出标志OF
方向标志DF
中断标志IF
符号标志SF
零标志ZF
辅助标志AF
奇偶标志PF
进位标志CF
有/无
减/增
开/关
负/正
零/非
偶/奇
OV/NV
DN/UP
EI/DI
NG/PL
ZR/NZ
AC/NA
PE/PO
CY/NC
(2)显示指定存储器内容
RAX
RF
15.搜索指定内存命令S(search)
S<
地址范围>
表>
在指定范围搜索表中内容,找到后显示表中元素所在地址
SCS:
10011041
显示O4BA:
O1O4
04BA:
01OD
表示在位移100H至11OH间的上述两处有41H。
又如:
100L1141“AB”E
表示在当前代码段位移100H至111H处找连续4个字节内容为41H、41H、42H、0EH的地址。
16.执行并显示系统环境命令T(trace)
T[=〈地址)][〈条数〉]
的缺省值是当前IP值,<
条数>
的缺省值是一条。
执行由指定地址起始的、由<
指定的若干条命令。
T执行当前指令并显示状态
T10从当前指令始执行10H条指令
17.反汇编命令U(unassemble)
(1)U<
(2)U<
将指定范围内的代码以汇编语句形式显示,同时显示地址及代码。
注意,反汇编时一定确认指令的起始地址后再作,否则将得不到正确结果。
地址及范围的缺省值是上次U指令后下一地址的值。
这样可以连续反汇编。
18.写盘命令W(write)
W〈地址〉〈盘号〉〈起始逻辑扇区〉〈所写逻辑扇区数n〉
与L命令不同的地方是将内存〈地址)起始的一片单元内容写人指定扇区。
只有W而没有参数时,与N命令配合使用写盘文件。
三、实验步骤
1.启动DEBUG,用“R”命令显示各寄存器值,记录并说明DEBUG的初始工作环境。
2认真学习"
D"
命令、“E”命令、“R”命令的功能、应用、命令格式、各种显示信息及含义,自行设计操作进行,掌握它们的用法,要求做到能对不同地址中的内容和寄存器进行熟练的检查和修改。
记录练习的操作和过程,解释结果;
说明各个寄存器的初值以及段地址、偏移地址的意义,确实掌握地址与其中存放的数据之间的关系。
3.阅读下列源程序指令,用铅笔填写运行结果。
再用“A”命令输入这些源程序指令(运行结果部分不输入):
地址目标代码源程序指令运行结果
__________________MOVAX,1234H;
AX:
______
__________________INCAX;
______CF:
__Z