8086汇编中DEBUG的D命令问题
2018-04-23 Programming因为汇编程序在显示器上输出内容相当麻烦,所以写汇编就离不开
DEBUG
的帮助。
DEBUG
中的D
命令被用来显示内存单元的内容。
对于这个比较常用的命令,我在使用时却遇到了一点小问题,默认不指定地址的情况下与教材描述不符。
原文
(1) 若 D 命令中有指定地址,则从指定地址开始显示;否则若没有指定地址,则从上一次 D 命令显示的最后单元的下一个单元开始显示,否则从 DS:100H 地址开始显示 128 个单元的内容。
(2) 若不指定段地址,则默认段地址是 DS。
代码
dseg segment
data db 170, 170, -1, -1
num db 1
dseg ends
cseg segment
assume cs:cseg, ds:dseg
start: mov ax, dseg
mov ds, ax
inc num
mov ah, 4ch
int 21h
cseg ends
end start
测试
按照教材上关于DEBUG
的描述,若没有指定地址,且是第一次运行D
命令,那么会从DS:100H
地址开始显示 128 个单元的内容。
但是在自己电脑上面尝试DEBUG
的结果与预期不符,为防止是本地 DOSBox 环境的影响,我又在实验课上利用实验室的 WinXP 直接运行DEBUG
测试了上面的代码,结果依然与预期不符:
R
命令查看DS
的段地址为13DD
,但是在单独使用D
命令的话,显示的却是从13EE:0000
开始的内容。而D 0
则没什么问题。
在询问实验课老师之后,老师猜测是因为代码开始时数据段尚未初始化的问题,所以我又尝试了在DEBUG
中先使用两次T
命令进行单步执行,待初始化代码段之后再使用单独的D
命令,结果如下:
依然没有找到所谓的DS:100H
。
准备写博客时偶然想到会不会教材上是指直接运行DEBUG
命令,而不是针对某个具体的程序?手上没有 WinXP,就在自己的 DOSBox 上试了下:
诶!这里的0740:0100
不就是DS:100H
吗?为了验证,我尝试修改了DS
的内容:
空欢喜一场,甚至刚打开DEBUG
后我先将DS
,ES
,SS
,CS
都从0740
修改为0750
,单独的D
命令显示还是从0740
开始。
最后尝试去查找DEBUG
的子命令说明,遇到了微软的过期网页,不过还好在 MSDN 的一个页面找到了不知道多久以前的说明。
If you do not specify range, Debug displays the contents of 128 bytes, starting at the end of the address range specified in the previous
d
command.
…
For each subsequentd
command you type without parameters, Debug displays the bytes immediately following those last displayed.
这里一直在强调使用不带有任何参数的D
命令时,从上一次D
命令显示的末尾地址下一个开始继续,并没有提到首次使用且未指定地址时D
命令的表现。
总结
到最后也没有弄明白教材上的DS:100H
是在什么情况下的D
命令默认显示,微软官网也没有涉及首次使用且未指定地址的D
命令的默认显示内容,就权当DEBUG
时首次使用D
命令必须指定地址吧。