debug调试工具的使用

(一)显示内存单元内容的命令D

格式(1)-D 地址

从指定地址开始显示128个字节的内容,每一行的左边显示段内偏移地址,接着显示16个单元的内容,最右边区域则显示这一行的16个单元所对应的可显示的字符。若无可显示的字符则用圆点(小数点)填充。 

D命令中的地址可为段内偏移量也可为段基址和段内偏移量两部分,中间用冒号隔开16800110即指段基址为1680H段内偏移量为0110HDebug中所显示的数据均为十六进制数且省去了后面的H标志。 

格式(2)-D 范围

将显示指定地址范围内的内存单元的内容起始地址可由段基址及段内偏移量两个部分组成中间用冒号“:”隔开也可以只指出段内偏移量而此时的段基址在DS中。这里所说的范围包含起始地址和结束地址。

比如 D DS:1000  1020

将显示数据段偏移地址为1000H1020H的内容。  

 

(二)修改内存单元内容的命令E

格式(1)-E 地址 内容表

它的功能是用给定的内容表去代替所指定的内存单元的内容。 

例如

E  DS0110   41  CLOSE  41

该命令执行后将用列表中的7个字符填入从DS0110 DS0116 7个存储单元中。

格式(2)E 地址

它的功能是可以连续地逐个修改内存单元的内容。当屏幕上显示指定单元的地址和内容之后可采取下列办法:

①若指定单元的内容需要修改则将新的内容的十六进制数输入再按空格键修改便告完成然后显示下一个存储单元的地址及内容若需要修改可进行同样的操作。若某一个单元的内容不需要修改而操作又要进行下去则可直接按空格键。 

②若需要显示前一个单元的地址和内容则输入连接号-′,若要修改则输入新的内容;若显示前一个单元的地址和内容仍要修改则可进行同样的操作;若显示的内容不需要修改则可直接按-′键使该操作由高地址向低地址单元连续不断地进行。

③按结束E命令。 

 

(三)检查和修改寄存器内容的命令R

格式(1)R

此时将显示所有寄存器的内容和全部标志位的状态以及现行CSIP所指的机器指令代码和反汇编符号。 

格式(2)R 寄存器名

该格式可用于检查和修改指定寄存器的内容。若不修改其内容可按若需要修改其内容可以输入1-4 个十六进制数再按键。 

格式(3)RF

该格式可用于显示标志和修改标志位状态。 

当系统给出标志位状态后可采取下列办法:

①若不需要修改任一标志位可按键。 

②若需要修改一个或多个标志位可输入其相反的值各标志位之间可以无空格且与顺序无关修改后按键。 

由于标志位状态显示时是用下列特殊符号表示的因而修改时只要输入规定的符号即可。下面是标志名和状态符号的对照表:

    标志名置                  位符号复              位符号

溢出标志OF(/)                OV                  NV

方向标志DF(/)                DN                  UP

中断标志IF(允许/禁止)             EI                   DI

符号标志SF(/)                 NG                  PL

零标志ZF(/)                   ZR                  NZ

辅助进位标志AF(/)            AC                   NA

奇偶校验标志PF(/)             PE                  PO

进位标志CF(/)                CY                   NC

只有追踪标志TF不能用指令直接修改。 

例如:输入RF命令系统可能作出如下响应

OV DN EI NG ZR AC PE CY-

若现在要修改奇偶、零、中断和溢出标志位可在光标处输入:

PO NZ DI NV

 

(四)运行程序命令G

格式:G =地址][地址[地址]]

该命令可以在程序运行中设置断点。它是Debug程序进行程序调试的主要命令之一。

示例:-g 001a 则执行从当前cs:ip001a的指令,注意:地址设置必须从指令的第一字节设起。

①第一个参数“=地址”规定了程序执行的起始地址CS内容作段地址等号后面的地址只需给出地址偏移量。此时命令G与地址之间的等号不能省去。 

如果在G命令执行前已经设置了CS值和IP则也可以直接用G命令从指定地址执行程序。 

②格式中后面给出的地址是指断点地址最多可设置10个断点。当程序执行到一个断点时,就停下来,显示CPU各寄存器的内容和标志位的状态以及下一条待执行的指令被调试程序的所有断点全部被取消并返回Debug 

③地址参数所指的单元必须包含有有效的8088指令的第一个字节否则将产生不可预料的结果。 

④堆栈必须至少包含有6个可用字节否则也将产生不可预料的结果。 

⑤若断点地址只包括地址偏移量则认为段地址在CS寄存器中。 

 

(五)追踪命令T

格式(1)T =地址]

该命令可以在指令执行中进行追踪若略去地址则从CSIP现行值执行。每一次T命令都执行一条指令。 

格式(2)T =地址][值]

此时,它可对多条指令进行追踪即在执行了由值所指定的若干条指令之后停止执行并显示各寄存器的内容和各标志位还指出下一条待执行的指令。 

 

(六)汇编命令A

若在调试目标程序的过程中要求改写或增添一段目标程序则可以用A命令直接在Debug下实现。 

格式:A [地址]

该命令可以从指定地址开始将输入的汇编语言语句立即汇编成机器代码连续存放在内存单元中。在程序输入完毕后最后一行不输入内容直接按回车键即可返回DEBUG程序还可用反汇编命令U对刚输入的内容进行反汇编以验证输入的程序是否正确。 

使用A命令应遵守以下规则:

 所有输入数值均为十六进制数。 

 前缀助记符必须在相关指令的前面输入可以在同一行也可以在不同行输入。 

 段超越助记符为CS: DS: ES: SS: 

 远调用时的返回指令助记符用RETF

 使用串操作指令时助记符中必须注明是字节还是字传送。 

 汇编语言能自动汇编短、近和远的转移及近和远的调用,也能由NEARFAR前缀来超越。 

例如:

    0110:0600 JMP 602;短转移

    0110:0602 JMP NEAR 605;近转移

    0110:0605 JMP FAR 60A;远转移

    第一条JMP指令中含有一个字节偏移量。 

    第二条JMP指令中含有两个字节偏移量。 

    第三条JMP指令中含有两个字节的偏移量及两个字节的段地址。 

 DEBUG不能确定某些操作数涉及的是字类型存储单元还是字节类型的存储单元时在这种情况下必须用前缀WORD PTRBYTE PTR来加以说明。

例如:

NEG BYTE PTR 128                     

DEC WORD SI   

 Debug不能确定一个操作数是立即数还是存储单元的地址时可以把地址放在方括号中。

 两个最常用的伪指令DBDW可以在A命令中使用用来直接把字节或字的值送入相应的存储单元。

例如:

DB  2534THIS IS AN EXAMPLE

DW  600020007000BA   

Debug支持所有形式的寄存器间接寻址命令。

例如:ADD BX74BP+3][SI-5

POPBX+DI

 

(七)反汇编命令U

格式(1)U地址

该命令从指定的地址开始反汇编32个字节。若略去指定地址则以上一个U命令反汇编的最后一条指令地址的下一条指令地址作为起始地址;若没有用过U命令则以由Debug初始化的段寄存器的值作段地址100作为地址偏移量。 

格式(2)U范围这种格式的命令可以对指定范围的内存单元进行反汇编范围可以由起始地址、结束地址(只能包含地址偏移量)或起始地址及长度来指定。其命令格式如:

U 04BA:100  0108   U  04BA:0100  L7

两者是等效的。 

 

(八)输入命令I

格式:I端口地址

该命令从指定端口输入一个字节并显示。 

例如: I  2E8

C  C

它表示所显示的是从02E8 端口输入的一个字节为CC 

 

(九)输出命令O

格式:O端口地址 字节值

其功能是向指定的端口输出一个字节。 

例如:O 2E8 12

它表示将一个字节12H送到输出端口2E8 

 

(十)命名命令N

格式N文件标识符[文件标识符]

该命令用给定的两个文件标识符格式化在CS:5CCS:6C的两个文件控制块中(若在调用Debug时具有一个文件标识符则它已格式化在CS:5C的文件控制块中)文件控制块是将要介绍的装入命令L和写命令W所需要的。 

N命令能把文件标识符和别的参数放至CS:81开始的参数保存区中。在CS:80中保存输入的字符个数 寄存器AX保存前两个文件标识符中的驱动器标志。 

例如:

A>DEBUG

N  TEST

L

N命令后L命令可将TEST调入自己的CS:100开始的存储区中。若对正在调试的程序TEST进行调试时需要用到其它的文件标识符及其它参数也可用N命令加以实现。;

例如:                     

A>DEBUG TEST

  N  文件1  文件2

 

(十一)装入命令L

 

格式1: L <地址> <驱动器号> <起始逻辑扇区> <所读扇区个数n>

    其中<地址>的缺省值为CS:100。逻辑扇区可由物理扇区号换算得到,以双面双密度盘为例:物理扇区是按0面0道1区,0面0道2区,……,0面0道9区,0面1道1区,……,0面39道9区,1面0道1区,……,1面39道9区排列。而逻辑扇区与物理扇区号的对应关系为物理扇区0面0道1扇区至9扇区,逻辑扇区号为0—8;物理扇区1面0道1扇区至9扇区,逻辑扇区号为9—11H;物理扇区0面1道1扇区至9扇区,逻辑扇区号为12—1AH;……。这样每道先0面后1面一直排下去。

    其中<驱动器号>为0、1或2,0表示A驱,1表示B驱,2表示硬盘。

功能: 将<驱动器号>指定的盘上,从<起始逻辑扇区>起,共n个逻辑扇区上的所有字节顺序读入指定内存地址开始的一片连续单元。当L后的参数缺省时,必须在L之前由N命令指定(或进入DEBUG时一并指出)所读驱动器文件名。此时L执行后将该文件装入内存。

    例如:-N EXAMPLE

          -L

   将当前驱动器上的EXAMPLE文件装入CS:100起始的一片内存单元。

格式2L地址或L

该命令把已在CS:5C中格式化的文件控制块所指定的文件装入到指定区域中。 

若省略地址则装入到CS:100开始的内存区域中。 

若是带有扩展名.COM.EXE文件无论命令中是否指定了地址一律装入到CS:100开始的内存区域中去。

通常在BXCX中包含了所读入文件的字节数但对具有扩展名.EXE文件BXCX中还包含实际程序长度。

 

(十二)写命令W

功能: LW命令指定待装入/写盘文件

格式1W <地址> <盘号> <起始逻辑扇区> <所写逻辑扇区数n>

功能:与L命令不同的地方是将内存从<地址>起始的一片单元内容写入指定扇区。只有W而没有参数时,与N命令配合使用将文件写盘。该命令把由地址所指定的内存区域中的数据写入指定的驱动器。若地址中只包含偏移量,则段地址在CS中。

其中,扇区号决定了写入起始扇区;区段数决定了写入的区段个数;扇区号和区段数均用十六进制数表示。

格式2W地址或W

该命令把指定内存区域中的数据写入到由CS:5C处的文件控制块所规定的文件中去。若省略地址则内存区域从CS:100 开始。

对于扩展名为.EXE.HEX文件不能写入。因为这些文件的写入要用一种特殊格式而此格式Debug程序不支持。 

 

(十三)退出Debug命令Q

格式:Q

该命令退出Debug程序并返回DOS 

Q命令并不把内存中的文件存盘若需要存盘的话应在退出前用W命令写入磁盘。


简单汇编语言程序调试

Code SEGMENT

      ASSUME CS:code,DS:code

      ORG 100H            ;从100H处开始存放下列指令

Start:MOV AX,code         ;将DS置成code段的首地址

      MOV DS,AX

      MOV SI,200H         ;取第一个数的首地址

      MOV AX,[SI]         ;将第一个数的低16位取到AX

      MOV DI,204H         ;取第二个数的首地址

      ADD AX,[DI]         ;第一个数和第二个数的低16应相加

      MOV [SI+8],AX       ;低16位相加的结果送到208H和209H单元

      MOV AX,[SI+2]       ;取第一个数的高16位送到AX中

      ADD AX,[DI+2]       ;两个数的高16位相加

      MOV [SI+0AH],AX     ;高16位相加的结果送到20AH,20BH单元

      MOV AX,4C00H        ;使用DOS的4CH号功能调用

      INT 21H             ;进入功能调用,返回DOS

      ORG 200H            ;从200H处开始存放下列数据

      DD 12345678h,654387A9h,0h ;被加数、加数、和

Code ENDS

    END start

debug调试工具的使用_第1张图片

debug调试工具的使用_第2张图片

 debug调试工具的使用_第3张图片

 debug调试工具的使用_第4张图片

 debug调试工具的使用_第5张图片

 

 



你可能感兴趣的:(日记博客)