zoukankan      html  css  js  c++  java
  • DEBUG的基本命令的使用[MASM]

    DEBUG的基本命令的使用

    DEBUG是专门为汇编语言设计的一种调试工具,它通过步进,设置断点等方式为汇编语言程序员提供了非常有效的调试手段。

    DEBUG的命令都是一个字母,后跟一个或多个参数:字母 [参数]

    命令的使用中注意:

    ① 字母不分大小写;

    ② 只使用16进制数,没有后缀字母;

    ③ 分隔符(空格或逗号)只在两个数值之间是必须的,命令和参数间可无分隔符;

    ④ 每个命令只有按了回车键后才有效,可以用Ctrl+Break中止命令的执行;

    ⑤ 命令如果不符合Debug的规则,则将以“error”提示,并用“^”指示错误位置。

    许多命令的参数是主存逻辑地址,形式是段基地址 : 偏移地址。其中,段基地址可以是段寄存器或数值;偏移地址是数值。如果不输入段地址,则采用默认值,可以是缺省段寄存器值。如果没有提供偏移地址,则通常就是当前偏移地址。

    对主存操作的命令还支持地址范围这种参数,它的形式是:开始地址 结束地址(结束地址不能具有段地址),或者是:开始地址 L字节长度

    DEBUG命令一览:

    分类

    命令格式

    功能简介

    读写寄存器

    R

    显示所有寄存器的当前内容

    R寄存器名

    显示和修改指定寄存器内容

    RF

    显示和修改标志寄存器内容

    汇编和反汇编

    A[内存地址]

    从指定地址开始汇编指令

    U[内存块]

    对指定内存块进行反汇编

    执行指令

    T[:内存地址][条数]

    单步或多步执行指令(进入过程)

    P[=内存地址][条数]

    单步或多步执行指令(不进入过程)

    G[=内存地址]

    连续执行指令

    G[=内存地址]断点地址

    设断点执行程序

    读写内存

    D[内存块]

    显示指定内存块内容

    E 内存地址 字符或数值串

    修改指定内存内容

    F 内存块 字符或数值串

    填充指定内存块

    S 内存块 字符串或数值

    在指定内存块中查找串

    M 内存块1 内存块2的首地址

    复制内存块内容

    C 内存块1 内存块2的首地址

    比较两个指定内存块

    读写磁盘

    N[d][path]文件名.扩展名

    指定欲读写的磁盘文件

    W 内存地址

    将指定内存块写入文件

    L [内存地址]

    将文件调入内存

    读写I/O端口

    I 端口地址

    读入指定端口的内容

    O 端口地址  数值

    将数据写入指定端口

    十六进制加减

    H 数值1 数值2

    计算并显示两数之和,两数之差

    退出DEBUG

    Q

    退出DEBUG,返回DOS

    1、DEBUG程序的启动

    DOS提示符下,可键入命令:

    C:>DEBUG↙

    DEBUG命令的完整格式为:DEBUG [d:][path][文件名][ 参数1][参数2]。其中[d:]是盘符,[path]是路径,文件名是被调试文件的名称,它须是执行文件(EXE),两个参数是运行被调试文件时所需要的命令参数,在DEBUG程序调入后,出现提示符“-”,此时,可键入所需的DEBUG命令。

    在启动DEBUG时,如果输入了文件名,则DEBUG程序把指定文件装入内存。用户可以通过DEBUG的命令对指定文件进行修改、显示和执行。如果没有文件名,则是以当前内存的内容工作,或者用命名命令和装入命令把需要的文件装入内存,然后再用DEBUG的命令进行修改、显示和执行。

    2、DEBUG的主要命令

    (1)、检查和修改寄存器内容的命令R,它有三种方式:

    1)显示CPU内部所有寄存器内容和标志位状态,格式为:-R

    例如:输入-R↙,得到结果如下:

    2)显示和修改某个指定寄存器内容,格式为:-R 寄存器名

    例如:输入-R AX,得到结果如下:

    表示AX当前内容为0000,此时若不对其作修改,可按ENTER键,否则,输入修改内容后,如:

    AX内容由0000改为0A0A

    3)R命令显示标志寄存器标志位状态的含义如下表所示:

    标 志 名

    置  位(值为1)

    复  位(值为0)

    溢出Overflow(是/否)

    OV

    NV

    方向Direction(减量/增量)

    DN

    UP

    中断Interrupt(允许/屏蔽)

    EI

    DI

    符号Sign(负/正)

    NG

    PL

    零Zero(是/否)

    ZR

    NZ

    辅助进位Auxiliary Carry(是/否)

    AC

    NA

    奇偶Parity(偶/奇)

    PE

    PO

    进位Carry(是/否)

    CY

    NC

    修改标志位状态,命令格式为:-RF

    例如:输入-RF,输出结果如下:

    这时若不作修改可按ENTER键,否则在“-”号之后键入修改值,键入顺序任意。如:

    (2)、汇编命令A,格式为:-A[地址]

    该命令从指定地址开始允许输入汇编语句,把它们汇编成机器代码相继存放在从指定地址开始的存储器中。A命令中如果没有指定地址,则接着上一个A命令的最后一个单元开始;若还没有使用过A命令,则从当前CS : IP开始。

    例如:输入代码,则代码存储在OAFO:0100至OAFO:010D单元中。

    (3)、反汇编命令U,有两种格式:

    1)-U[地址]

    该命令从指定地址开始,反汇编32个字节,若地址省略,则从上一个U命令的最后一条指令的下一个单元开始显示32个字节。

    2)-U范围

    该命令对指定范围的内存单元进行反汇编,例如:

    -U 0100 011E或-U 100 11E 或-U 0AF0:0100 011E或–U 0AF0:0100 L1F(L用来引导指令的条数,1F为指令的条数),这些命令是等效的。

    (4)、运行命令G,格式为:

    -G [=地址1][地址2]

    其中地址1规定了运行起始地址,后面的地址为断点地址。若省略地址,则运行从IP所指的地址开始。例如:

    (5)、追踪命令T,有两种格式:

    1)逐条指令追踪:

    -T

    该命令从指定地址起执行一条指令后停下来,显示寄存器内容和状态值。例如:

    2)多条指令追踪:(有问题)

    -T[=地址][值]

    该命令从指定地址起执行n条命令后停下来,n由[值]确定。

    (6)、显示内存单元内容的命令D,格式为:

    -D[地址](从给出的地址开始连续显示128个字节的单元内容)或-D[范围],例如:

    (7)、修改内存单元内容的命令E,它有两种格式:

    1)用给定的内容代替指定范围的单元内容:

    -E地址  内容表

     例如:-E 2000:0100  F3 “XYZ” 8D

    其中F3,“X”“Y”“Z”和8D各占一个字节,用这五个字节代替原内存单元2000:0100到0104的内容,“X”“Y”“Z”将分别按它们的ASCII码值代入。

    2)逐个单元相继地修改:

    -E地址

    例如:-E 100:

    0AF0:0100 F3.E7

    此命令是将原100号单元的内容F3改为E7。E7是键入值。

    (8)、命名命令N,格式为:

    -N 文件名

    此命令将文件名格式化在CS:5CH的文件控制块内,以便使用L或W命令把文件装入内存进行调试或者存盘。例如:

    (9)、装入命令L,它有两种功能:

    1)把磁盘上指定扇区的内容装入到内存指定地址起始的单元中,格式为:

    -L  地址  驱动器  扇区号  扇区个数

    2)装入指定文件,格式为:

    -L [地址]

    此命令装入已在CS:5CH中格式化的文件控制块所指定的文件。

    在用L命令前,BX和CX中应包含所读文件的字节数。

    3)装入已在文件控制块中的文件,格式为:

    -L

    此命令与-L [地址]相同功能。

    (10)、写命令W,有两种格式:

    1)把数据写入磁盘的指定扇区:

    -W  地址  驱动器  扇区号  扇区数

    2)把数据写入指定文件中:

    -W  [地址]

    此命令把指定内存区域中的数据写入由CS:5CH处的FCB所规定的文件中。在用W命令前,BX和CX中应包含要写入文件的字节数。

    (11)、十六进制运算命令H,格式为:

    H [数据1] [数据2]

    其功能是将两个十六进制数进行相加、相减运算,结果显示在屏幕上。例如:

    (12)、退出DEBUG命令Q,该命令格式为:

    -Q

    它退出DEBUG程序,返回DOS,但该命令本身并不把在内存中的文件存盘,如需存盘,应在执行Q命令前先执行写命令W。

    附二.DEBUG32的重要扩展命令的使用

    1)、R16/R32更换寄存器显示位数命令

      R16 设置 16 bit 显示模式

      R32设置 32 bit 显示模式

    2CLS清屏命令

    D 查看数据内容指令:

    D 命令——查看内存单元

    前面我们学到,内存每 16 个字节单元为一小段,逻辑段必须从小段的首址开始。用 D 命令可以查看存储单元的地址和内容。

    D 命令格式为:

    D  段地址:起始偏移地址 [结尾偏移地址] [L范围]
    

    例如:

    D DS:0      查看数据段,从 0 号单元开始
    D ES:0        查看附加段,从 0 号单元开始
    D DS:100    查看数据段,从 100H 号单元开始
    D 0200:5 15     查看 0200H 段的 5 号单元到 15H 号单元(在虚拟机上该命令不能执行)
    D 0200:5 L 11   用 L 选择范围。查看 0200H 段的 5 号单元到 15H 号单元共 17 个单元

    图中第一条 D 命令显示的是数据段存储单元的内容,可以看到数据段的段地址为 DS,其值 0B05H。0 号单元的内容为 CDH,1 号单元为 20H ,...,第 15 号单元的内容为 03H;第二行 0010H 号(16 号)单元的内容为 69H,它是小写字母 i 的 ASCII 码,因此右边区域中显示了 i ,表示该单元的值 69H 可以看成 ASCII 码。

    第二条 D 命令显示 0200H 段中的内容,也是从 0 号单元开始。

    第三条 D 命令从 0200H 段的 5 号单元开始显示直到 15H 号单元。

    如果在 D 后面直接写出偏移地址,则显示当前数据段下偏移地址开始的内存单元,如:

    D 10        从数据段10H号单元开始显示
    D100    从数据段100H号单元开始显示
    

    注意:多次键入 D,可连续显示后面的单元内容

    用 D DS:0 命令显示后,可以看到,这三个单元的值由原来的 9F 00 9A 修改为 14 15 16。

    如果 E 后面直接跟偏移地址,则修改当前数据段下偏移地址所指单元值;还可以用 E 命令修改其它段的存储单元内容。

    E 10        修改当前数据段10H号单元内容
    E ES:100    修改附加段100H号单元内容
    D ES:100      查看一下100H单元的内容是否修改了

    U 后跟偏移地址,则从该地址开始反汇编。如:

    U 0       从代码段0号单元开始反汇编
    U100     从代码段100H号单元开始反汇编
    

    需要注意的是,图 2-22 中显示的程序代码并不是用户编写的程序,因为在输入 DEBUG 命令时没有写用户程序名.EXE。这段程序代码是系统代码段中保存的内容,有可能是系统程序,也有可能是无效的代码。

    (5)A 命令——输入汇编指令

    在 DEBUG 中,使用 A 命令可以输入汇编指令,系统自动地将键入的汇编指令翻译成机器代码,并相继地存放在从指定地址开始的存储区中。由于 DEBUG 下的数值默认为十六进制数,因此先要将十进制数转换成十六进制数。

    例如,第 1 章提到的计算 Z = 35 + 27 的汇编指令为:

    MOV  AX,23H
    ADD  AX,1BH
    MOV  [0000],AX
    

    加法的结果 Z=62=3EH。变量 Z 用存储单元[0000]表示。这三条指令可在 DEBUG 下用 A 命令直接输入。输入 A 命令后,系统自动地给出逻辑地址为 0AEE:0100(CS:偏移地址),在其后输入汇编指令,回车后可输入下一条指令,直接回车则退出输入

  • 相关阅读:
    tensorflow日志信息如何屏蔽?
    测试图像篡改模型fps逐渐降低的原因?
    np.float32()和np.float64
    hive on spark运行时 ,读取不到hive元数据问题
    Hadoop之HDFS(二)HDFS工作机制和集群安全模式
    Spark中的Driver和Executor详解及相关调优
    Linux查看物理CPU个数、核数、逻辑CPU个数
    shell命令查看进程id,并杀死进程,停止脚本
    Flink CDC 2.0 正式发布,详解核心改进
    Kafka 如何保证消息的消费顺序一致性
  • 原文地址:https://www.cnblogs.com/dgwblog/p/11857976.html
Copyright © 2011-2022 走看看