先看说明书:
文章目录
- 分项操练
- -A
- -C
- -D
- -E
- -F
- -G
- -H
- -I
- -L
- -M
- -N
- -O
- -P
- -Q
- -R
- -S
- -T
- -U
- -W
- -XA
- -XD
- -XM
- -XS
- -?
分项操练
-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之间的内容
上面我首先展示了一下各个寄存器的值,我们可以看到,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为扩充内存。
-?
获取说明书