① windows 10 汇编环境的搭建
1 工具准备
1)下载
工具介绍:DOSBox 是一个 DOS 模拟程序,由于它采用的是 SDL 库,所以可以很方便的移植到其他的平台。目前,DOSBox 已经支持在 Windows、Linux、Mac OS X、BeOS 、palmOS、Android 、webOS、os/2等系统中运行。不少DOS下的游戏都可以直接在该平台上运行。
2)下载MASM32
工具介绍:MASM32是国外的MASM爱好者Steve Hutchesson自行整理和编写的一个软件包,目前最高版本为11r版。MASM32并非指Microsoft的MASM宏汇编器,而是包含了不同版本工具组建的汇编开发工具包。它的汇编编译器是MASM6.0以上版本中的Ml.exe,资源编译器是Microsoft Visual Studio中的Rc.exe,32位链接器是Microsoft Visual Studio中的Link.exe,同时包含有其他的一些如Lib.exe和DumpPe.exe等工具。
注意:也可以直接下载由参考资料3作者提供的masm工具压缩包,里面包含必要的汇编、链接、调试工具(网络网盘下载)。
2 安装工具
1)安装DOSBOX
安装下载到的DOSBox0.74-win32-installer.exe,直接一路Next完成安装。
2)配置DOSBOX
创建一个用于保存汇编工具(如MASM、Link、DEBUG等工具)和汇编文件(*.asm)的目录,如:E:\DEBUG。
打开DOSBOX的安装根目录(默认安装路径:C:\Program Files\DOSBox-0.74),双击文件DOSBox 0.74 Options.bat,运行该批处理文件后系统会用文本文档Notepad打开配置文件dosbox-0.74.conf。
将光标定位到dosbox-0.74.conf文件的[autoexec]节点(一般在该文件末尾),在文件中添加以下内容:
[plain] view plain
MOUNT C D:\DEBUG # 将目录D:\DEBUG挂载为DOSBOX下的C:
set PATH=$PATH$;D:\DEBUG # 将D:\DEBUG写入环境变量PATH中
3)安装MASM32
可解压安装下载到的masm32v11r.zip,按默认配置安装即可。
安装结束后,可直接利用masm32v11r中的gedit.exe程序编写、编译和链接asm汇编程序。
注意,MASM32的替代方案:可直接从其他电脑上复制汇编工具DEBUG.EXE、EDIT.EXE、LINK.EXE、MASM.EXE等工具复制到E:\DEBUG文件夹下(复制时注意不能将32位系统中找到的上述工具复制到64位系统中使用)
3 样例程序
1)运行DOSBOX,在命令符C:\>下输入命令:EDIT文件名.asm,启动EDIT.EXE进入代码编辑状态,并输入如下样例程序:
[plain] view plain
code segment
assume cs:code
start:
mov ax,5h
mov bx,6h
add ax,bx
mov ah,4ch ; 调用DOS的4C号功能
int 21h ; 退出DEBUG状态,返回DOS
code ends
end start
2)保存文件后返回DOSBOX的命令行,输入命令:MASM文件名.asm,生成目标文件文件名.OBJ(生成过程中可以修改目标文件名,直接回车可保持默认目标文件名)。
注意:此时可能生成三个文件:*.obj、*.lst和*.crf文件。其中,列表文件*.lst和交叉引用文件非必选,前者是汇编语言汇编的机器语言与汇编语言对照表,可用于调试;后者给出了用户定义的所有符号和对每个符号定义、引用的行号。
3)输入命令:LINK文件名.OBJ,链接生成可执行文件文件名.EXE。
注意:由于在上述代码中未定义堆栈段,故在链接时会提示:LINK : warning L4021: no stack segment,因不会影响执行文件的生成,故暂时忽略。
另外,此时可能生成两个文件:*.exe和*.map文件。其中,地址映射文件*.map给出内存地址分配的有关信息。
4)输入命令:DEBUG文件名.EXE,在DEBUG的命令提示符“-”出现后开始调试,以下是部分调试命令及截图:
输入命令:R,查看程序运行前的寄存器组初始值;
输入命令:U,查看程序反汇编代码。从反汇编代码中可看出,变量会被汇编为直接寻址方式,使用变量在数据段内的有效地址表示。
输入命令:T,单步调试;
输入命令:D,观察内存变化(D后不带地址或范围,默认显示上一个D命令之后的80字节内容);
输入命令:G 地址,程序从当前位置直接运行到指定地址处停下。
输入命令:E 地址修改内存中的内容,如:E DS:0100,输入空格可逐个字节修改,回车停止修改。