实验环境: dosbox + MASM
安装 (Arch Linux):
yay -S dosbox
安装 (Ubuntu/Debian):
sudo apt install dosbox
启动:
dosbox
调整窗口大小:
配置文件位于 ~/.dosbox/dosbox-0.74-3.conf,编辑配置文件 [sdl] 分组下的 windowresolution 和 output 字段:
- 将
windowresolution的值由original调整成希望的尺寸,格式形如1280x800 - 将
output字段的值由surface调整为opengl
原始配置:
[sdl]
windowresolution=original
output=surface
修改后配置:
[sdl]
windowresolution=1280x800
output=opengl
注意: 以上解决方案适用于在 4K 显示器下窗口显示过小的问题,但调整大小后,窗口内的文字大小也随之变大。也就是暂时无法调整窗口内显示文字的行数。
需要单独下载,套件内包括汇编器 MASM.EXE,链接器 LINK.EXE,调试器 DEBUG.EXE,代码编辑器 EDIT.COM 等。
将下载好的 MASM 工具放置在某个目录下,例如 ~/masm (~ 表示家目录) 。启动 dosbox 后使用 mount 命令挂载主机目录并切换盘符,即可在 dosbox 中使用 MASM 。以下命令表示将主机的 ~/masm 目录映射到虚拟盘符 c: 并设置当前工作目录为虚拟 c 盘的根目录。
mount c ~/masm
c:
以上两条命令 ( mount 与切换盘符 ) 可以写入 dosbox 的配置文件末尾的 [autoexec] 分组,以便在下次启动 dosbox 时自动执行。
类似地,编写代码的目录也可通过上述方式挂在进 dosbox,例如固定为 ~/x86 。将该目录通过 mount 命令挂载到虚拟盘符 d:。而后默认采用 d: 即代码目录作为 dosbox 的默认工作目录。(此时由于 MASM 可执行文件不在当前工作目录下,需要将其加入 PATH 环境变量以便调用。在 dosbox 中使用 set 命令设置环境变量)
完整的配置文件 [autoexec] 分组需添加内容如下:
mount c ~/masm
mount d ~/x86
set PATH=%PATH%;C:\;
d:
以汇编程序 HELLO.ASM 为例:
-
汇编:
MASM.EXE HELLO.ASM,生成目标文件HELLO.OBJ可选择是否生成
.LST文件和.CRF文件,其中.LST文件为汇编和机器码的对应,体现了汇编语言如何翻译。 -
链接:
LINK.EXE HELLO.OBJ,生成可执行文件HELLO.EXE可选择是否生成
.MAP文件和.LIB文件,其中.MAP文件为内存图,含有每个段的起始地址,长度等信息。 -
执行:
HELLO.EXE
注: 在 dosbox 中可以使用 Tab 键补全命令,例如键入 ma 后按 Tab 即可自动补全为 MASM.EXE。
- 打开文件:
EDIT.COM HELLO.ASM - 编辑文件: 与
nano或vim的INSERT模式相似,使用键盘方向键移动光标。 - 打开菜单栏: 按
Alt键控制菜单栏,使用方向键移动光标选择栏目,按Enter键打开或执行;或直接按相应栏目上高亮的字母以打开或执行。
调试程序: DEBUG.EXE HELLO.EXE
常用调试命令:
d显示内存单元内容- 无参数则默认从
CS:IP开始,连续使用则地址一直向后移动。 - 可指定起始地址, 地址格式形如
DS:0000或078A:0000
- 无参数则默认从
e修改内存单元内容- 需指定起始地址,格式同
d - 每次修改一个字节,可以连续修改多个字节
- 需指定起始地址,格式同
r查看和修改寄存器- 不加参数为查看
- 指定寄存器名为修改
u反汇编,查看机器码对应的汇编程序- 可以指定或不指定起始地址,规则同
d - 反汇编的结果不一定有意义(例如在数据段也可能反汇编出结果)
- 可以指定或不指定起始地址,规则同
a修改汇编指令- 不指定地址默认为
CS:IP - 可指定修改的地址
- 可以连续修改多条指令
- 不指定地址默认为
t执行一条指令,同 Step Inp执行完子程序/循环/功能调用,同 Step Overg执行到某个指令地址处,相当于断点- 不加参数则执行到结束
l装入文件w写回文件q退出调试器