在学习16位汇编的时候,需要用到MASM32编译器,为了方便编辑环境变量装了个XP的虚拟机来学习,刚好也可以用到debug.exe来调试16位汇编代码。
MASM32安装很简单。可以参考这篇文章,环境变量配置也有,ctrl+c,ctrl+v就OK,事先声明,MASM32版本下载的是masm32v11r。
参考文章中给了个Win32窗口的汇编代码,继续ctrl+c,ctrl+v,编译指令如下:
先编译资源文件,编译失败:给了个error RC2103错误。说是字符串错误,仔细看了下rc文件,没啥问题,尝试修改rc文件中的字符串。最后找到问题,不支持退出这2个汉字,换成确定啥的汉字都没问题,改成英文的Quit更好,就不需要纠结这个问题。
修改后:
// 资源文件注释格式为双斜杠
// 包含资源头文件,以能使用头键字
#include <resource.h>
// 指定对话框ID,asm文件中要定义同值变量才可引用
#define DLG_HELLOWORLD 1
// 定义对话框结构
DLG_HELLOWORLD DIALOG 350,200,213,164
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Helloworld Program"
FONT 11,"宋体"
{
CTEXT "Win32 Assembly Helloworld Program",-1,50,54,170,21
CONTROL "",-1,"Static",SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE,6,79,203,1
DEFPUSHBUTTON "确定",IDOK,158,86,50,21
}
编译asm,成功,接着链接,失败,给出一堆乱码的错误。
解决方案也很简单,把includelib到uer32.lib中间全部删除,换成空格一下,编译ok,链接失败,换了另一个错误,链接kernel32.lib错误,跟uer32.lib的解决方案一样,然后继续编译,链接成功,生成helloworld.exe文件,执行成功。
修改后的代码:
; asm文件注释格式为分号
; 定义程序模式
.386
.model flat,stdcall
option casemap :none
; 包含必要头文件,基本每个win32 汇编程序都需要包含这几个
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
; 指定对话框ID,该ID要与rc文件中的ID值相同
; 理论上,asm文件与rc文件中的控件是通过ID值关联的,控件名并不需要与rc文件相同,不过为了易看一般取一样的
; 比如这里重点是equ 1,叫不叫DLG_HELLOWORLD无所谓,不过为了易看所以选择与rc文件保持一致
DLG_HELLOWORLD equ 1
; 数据段
.data?
hInstance dd ?
; 代码段
.code
; 对话框处理过程
_ProcDlgHelloworld proc uses ebx edi esi hWnd,wMsg,wParam,lParam
mov eax,wMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax == WM_INITDIALOG
;invoke LoadIcon,hInstance,ICO_MAIN
;incoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
.elseif eax == WM_COMMAND
mov eax,wParam
.if ax == IDOK
invoke EndDialog,hWnd,NULL
.endif
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgHelloworld endp
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
; 弹出对话框,对话框与及处理过程在这里绑定
invoke DialogBoxParam,hInstance,DLG_HELLOWORLD,NULL,offset _ProcDlgHelloworld,NULL
invoke ExitProcess,NULL
; 指定程序入口点为start标识处
end start
到此为止,证明MASM32安装成功,虽然Win32窗口有个小瑕疵,就是确定这2个汉字变成了乱码,不喜欢的话,可以改成英文的Quit,这样就めでたしめでたし。不支持汉字感觉是不是漏装了啥,虚拟机的XP是原版的,外加只装了MASM32,没有装任何IDE。
正在学习的16位汇编都是用MASM32命令来编译的,刚安装的版本是不是太高了,没有MASM32.exe文件,网上查了下好像改名了,改成ML了。如果直接用ML来编译链接asm文件的话,给出一堆连接错误:
搜了下,解决方案就是ML后加参数/c,ml /c的意识是只编译不连接。因此还需要手动链接,因为是16位汇编,所以需要用link16,而不是link来链接。
ml /c 1.asm
link16 1.obj
链接成功后,需要用debug.exe来执行,不然就一闪而过。CS指令段地址是0B46,因此利用反汇编指令来查看。