• Dos系统的Debug工具简单使用(2023.9.7)


    先看说明书:

    在这里插入图片描述

    分项操练

    -A

    全称:assemble(汇编)

    作用:给定地址范围,写入汇编命令

    格式:-a 首地址

    • 如果不输入段地址指的是cs寄存器上的段地址
    • 如果不输入段地址和偏移地址则是cs和ip寄存器所指向的地址

    示例:

    在这里插入图片描述

    补充说明:在8086CPU有20根地址总线,所以物理地址是20位的,但是寄存器是16位的,所以物理地址是这样表示的,段地址:偏移地址,物理地址是段地址X16+偏移地址

    我们可以看到,mov ax, aaaa占3个字节,B8是mov ax的含义后面是数据AAAA

    d的用法详见D

    如果不指定地址用的是cs和ip寄存器所存的段地址和便宜地址

    -C

    全称:compare(比较)

    作用:比较两个相同长度内存块的内容,显示内容的差异处

    格式:一种是,-c输入段地址:偏移首地址,偏移尾地址,和要比较的cs寄存器所存的段地址的偏移首地址。如果都是在寄存器段地址的话,可以去掉前面的段地址。

    例如

    4000:0 3f 100
    就是
    比较内存块
    4000:0000 ~ 4000:003f 与 DS:0100 ~ DS: 013f之间的内容
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    上面我首先展示了一下各个寄存器的值,我们可以看到,DS寄存器存的值是0740,DS寄存器存的是默认的段地址,不指定另外的段地址的时候默认的段地址,IP寄存器则是默认的偏移地址,然后我用a指令,吧ax,3f20写入内存,注意,存的时候是按字节低位在前。我们可以看到存在差异的字节便是,偏移地址为0,3,4,5的地方。

    -D

    全称:dump(转存)

    作用:上面的用法可以看到,这个命令是以内存映像的方式显示内存中的信息,左边以16进制显示,右边用ASCII显示(不可见字符用句点表示)

    输入:-d 段地址: 首地址, 尾地址

    • 如果省略首地址,就是按照DS寄存器所存储的地址来索引

    还有一种:-d 首地址 + L20

    • 显示从首地址开始的20H(十六进制)个字节

    -E

    全称:enter(进入,开始活动)

    作用:从指定位置开始修改内存的值

    格式:e 首地址 数据1 数据2 。。。

    演示一下:

    在这里插入图片描述

    这里的数据,可以是16进制数,可以是单个字符(用单引号),也可以是字符串(用双引号)

    另外还有一种方式来修改,就是直接键入首地址,接下来他会一个字节一个字节的显示,光标会出现在点号的后面,如果不想修改可以按空格跳过,如果要修改就输入十六进制数,修改完毕就回车结束。

    在这里插入图片描述

    -F

    全称:fill(填充)

    作用:给指定的地址范围依次填充,直至填满。

    格式:-f 首地址 若干字节

    注意:是类似双指针一样,一个指针在循环遍历这个字符串,另一个指针在遍历这个内存范围,同样的我们可以自己指定地址段,也可以选择用ds寄存器内存的地址段。

    在这里插入图片描述

    -G

    全称:go(运行)

    作用:运行指定地址的命令

    格式:-g=首地址 若干断点地址

    写到这里,我认为,CS寄存器是记录command,DS寄存器是记录data的,后者用中括弧偏移地址来记录索引存储单元的,如有错误请指出

    在这里插入图片描述

    -g首先指定一个程序的开始地址,后面指定断点,如果不指定断点的话,会运行到程序结束。如果没有程序的结束的话,会直接无响应卡死。上面的命令的意思是从0740:0100开始运行,到0740:0103中断

    -H

    全称:Hex(十六进制)

    作用:输入两个十六进制数,返回两个十六进制数的和以及差

    在这里插入图片描述

    注意:差的时候,EEEF+2222=1111因为大于一个字节的部分被舍弃了

    -I

    全称:input(输入)

    作用:获取端口的一个字节

    格式:-i 端口号

    补充:8086CPU可访问的最大I/O空间为啥是64KB? - 知乎 (zhihu.com)

    在这里插入图片描述

    可以获取一个字节的数据

    -L

    全称:load(加载)

    作用:将一个文件或盘的绝对扇区装入存储器

    补充:汇编语言DEBUG命令详解||汇编命令||DEBUG的常用命令:A,U,R,T,D,E,Q 等等_追寻者A的博客-CSDN博客

    格式:L [内存地址] [磁盘驱动器号] [起始扇区] [扇区数],不过操作系统会拒绝访问磁盘驱动器

    -M

    全称:move(移动,说是移动,其实是拷贝)

    作用:将一段内存的内容拷贝到对应位置

    格式:-m 首地址 尾地址 新的首地址

    在这里插入图片描述

    这里我第一次没有指定段地址模式默认走CS的段地址,就是直接按照指定的首地址存储依次下来

    -N

    补充说明:.COM文件是命令文件(command),可以用来的执行的文件,现在的windows对这种格式的文件支持比较少了,在以前的MS-DOS系统中常见。

    全称:name(命名)

    格式:-n 文件名(路径)

    默认是cs段地址开始的程序,将它封装成可执行的文件,后续用W命令存入磁盘,之后便能用文件名直接调用该程序了。

    详见:汇编语言DEBUG命令详解||汇编命令||DEBUG的常用命令:A,U,R,T,D,E,Q 等等_追寻者A的博客-CSDN博客

    -O

    全称:output(输出)

    作用:向指定端口发送一个字节的内容

    格式:-o 端口 一字节

    和I命令有相似之处

    -P

    全称:proceed(行进,前往,继续做)

    作用:类似T命令,P与T命令的差别在于P命令把CALL/INT当成一条指令来执行,简化了跟踪过程,P命令只运行RAM内存的命令,而T命令则可运行RAM和ROM里的程序。

    -Q

    全称:quit(离开)

    作用:退出debug程序

    -R

    全称:register(寄存器)

    作用:查看,修改寄存器所存的值

    格式:

    ​ -r

    • 查看所有寄存器

      -r 寄存器

    • 修改某个寄存器的值

    在这里插入图片描述

    直接输入-r我们可以查看所有寄存器的值,8086CPU有14个寄存器,AX,BC,CX,DX;SP,BP;SI,DI;DS,ES,SS,CS,IP;PSW。上面展示了13个寄存器的值,但是没有PSW

    补充:一串NV等的字符是标志位

    标志位有

    OV(overflow,溢出) NV=(no overflow,未溢出)

    UP(up,增加) DN(down,下降)

    EI(enable interrupt,允许中断) DI(disable interrupt,禁止中断)

    PL(plus,正) NG(negative,负)

    NZ(not zero,非零) ZR(zero,零)

    PO(parity odd,奇数) PE(parity even,偶数)

    NC(no carry,不进位) CY(carry,进位)

    AC(auxiliary carry,辅助进位) NA(not auxiliary carry,不辅助进位)

    如果想要修改标志位,使用-r f

    在这里插入图片描述

    直接输入想要的标志位即可修改

    注意到,下面最后一行是关联的命令,前面是命令的地址,以及相应地址看到的数据
    在这里插入图片描述

    前面是一堆000反编译的命令,上面我看了看确实是CD

    在这里插入图片描述

    确实如此0000的反汇编就是 add [bx+si],al

    -S

    全称:search(搜索)

    作用:在指定范围搜索字节串出现的首地址,这里查到的字符串可能是互相重叠的,匹配每个可能出现的位置。

    在这里插入图片描述

    我写如右侧那个字符串,分别查找了aa字符串,和abc字符串,结果如上图

    -T

    全称:trace(追踪)

    格式和P相同:-t=首地址 指令数

    如果忽略地址的话,T命令从CS:IP开始运行

    在这里插入图片描述

    第一条指令打印了一下1000:0 10字节的内存(注意这些都是16进制),然后写两条汇编代码,可以看到对应机器指令是 b8 aa aa 和 bb bb bb,注意-t等号,我们可以看到两调指令执行完毕后寄存器的情况。

    -U

    全称:unassemble(反汇编)

    作用:上面也用了,可以将机器指令翻译成汇编,在内存中指令和数据没有任何区别,判定指令还是数据主要看是哪条总线上的数字。

    格式:-u 首地址 尾地址

    在这里插入图片描述

    -W

    全称:write(写)

    作用:将文件或者特点扇区写入磁盘,是和L命令对应的操作。

    -XA

    全称:allocate expanded memory(分配扩展内存)

    作用:给扩展内存分句柄

    格式:-xa 内存的页

    在这里插入图片描述

    -XD

    全称:unallocate expanded memory(释放扩展内存)

    格式:-xd handle

    在这里插入图片描述

    -XM

    全称:map expanded memory pages(映射扩展内存)

    作用:把扩充内存上的内存页区映射到主内存区

    格式:-xm RAM长页码 主内存页码 句柄

    -XS

    全称:display expanded memory status(展示扩展内存状态)

    作用:如其名

    在这里插入图片描述

    补充一下:扩充内存:(Expanded Memory)1985年初,Lotus、Intel和Microsoft三家共同定义了LIM-EMS,即扩充内存规范,通常称EMS为扩充内存。

    -?

    获取说明书

    在这里插入图片描述

  • 相关阅读:
    【Perl】与【Excel】
    我的创作纪念日
    一招解决MySql Specified key was too long; max key length is 767 bytes
    IceRPC之试试的新玩法"打洞"
    NT68661-屏参升级-RK3128-开机自己升级屏参
    神奇的 SQL ,同时实现小计与合计,阁下该如何应对
    零拷贝原理与实现
    python学习——字符串format用法,文本进度条实现
    项目启动报错提示包有冲突 ReflectionUtils$MethodFilter
    【开源教程6】疯壳·开源编队无人机-遥控器固件烧写
  • 原文地址:https://blog.csdn.net/gfyy_bkj/article/details/132742202