DOSBox debugger 的内存 dump 问题

DOSBox debugger 可以允许我们把内存 dump 下来,进行进一步的分析, 不过在使用 dump 命令时,我遇到了点问题

环境

我目前使用的是 DOSBox-x 0.83.22,当然严格说来这个和原版 DOSBox 有差别, 我切换到 DOSBox-x 主要是因为它功能较为丰富,而且 debugger 是自带的, 从菜单就可以呼叫。

Dump 内存指令

DOSBox dump 内存的指令有两个:

  • MEMDUMP seg:[off] [len] - Write memory to file memdump.txt.
  • MEMDUMPBIN [s]:[o] [len] - Write memory to file memdump.bin.

两个区别在于 memdump 生成的是 txt 文件,文件内容类似于 Data View 中如何显示内存的方式,这种格式比较易读,而 memdumpbin 则是把内存原样写入 数据文件,如果我们以后需要按数据格式读取,那么选择 memdumpbin 比较合适。

Dump 内存参数

两个 memdump 的参数相同:

  • len:内存的长度

字面上很容易理解,但是这个 len 参数使用起来却相当迷惑。比如如果我们想 dump 03e7:0000 到 03e7:ffff 的内存,那么这个命令应该是这样:

memdumpbin 03e7:0000 65536

这条命令得到的文件大小为 22k,明显小于 64k 的长度。

我们换成 16 进制试试看,但是因为 10000 会有歧义,首先我们用 ffff :

memdumpbin 03e7:0000 ffff

这次依然 dump 到了数据,但是只有 4k,那只好继续增加长度:

memdumpbin 03e7:0000 fffff

文件大小 65535 已经相当接近了,少了一个 byte,但是这五个 f 是代表什么意思, 是否是最后一个 f 是没有意义的,那我们试试 10000f:

memdumpbin 03e7:0000 10000f

文件大小变成了 15,也就是一个 f,这个长度参数就变得相当诡异了, 我们再试试 100000,结果文件长度为 0,那么再试试 16 进制的 1000000h, 文件大小又来到了 103M,感觉完全是一个玄学数字。

规避

我尝试了很多次,百思不得其解之后,开了一个脑洞:写成 fffff + 1 怎么样:

memdumpbin 03e7:0000 fffff+1

神奇的是居然成功了:

Untitled

结论

这个问题其实没有解决,我觉得深究下去意义也不大,因为接下来我打算看看 dump 的内存内容,目前我们只能得到如下结论:

  1. DOSBox-x 的 memdumpbin 指令的长度参数不可靠
  2. DOSBox-x 的 memdumpbin 指令的长度参数可能支持表达式

不过如果需要 dump 整段内存,我们能可以用 memdumpbin [seg]:0000 fffff+1 来回避这个问题。