VS功能强大,可以作为一个简单的汇编语言IDE来使用,为了使汇编代码支持高亮显示,首先建议安装一个AsmDude插件,如果之前已经安装过其他VS插件(例如Visual Assist),VS中应该有一个“扩展(X)”主菜单项,点击“扩展(X) ”菜单项 → 管理扩展,打开“管理扩展”对话框,选择“联机”,在搜索框中输入“AsmDude”,然后进行安装即可。
现在,通过VS编写64位汇编程序Hello World。创建一个空项目HelloWorld,打开VS → 创建新项目(N) → 选择“Windows桌面向导”,点击“下一步”按钮 → 项目名称输入“HelloWorld”,选择一个保存位置,点击“创建”按钮 → 选择应用程序类型为“桌面应用程序(.exe)”,勾选“空项目”,点击“确定”按钮,即可创建一个空项目。
接下来,有2处需要设置:
(1) 项目设置为Debug x64(或者Releasex64);
(2) 右键解决方案资源管理器中的项目名称“HelloWorld” → 生成依赖项(B) → 生成自定义(B)... → 打开“Visual C++生成自定义文件”对话框,勾选“masm(.targets, .props)”一项,点击“确定”按钮。
右键解决方案资源管理器中的项目名称HelloWorld中的“源文件”→ 添加(D) → 新建项(W)... → 打开“添加新项 - HelloWorld”对话框,选择“C++文件(.cpp)”,名称输入“HelloWorld.asm”,点击“添加”按钮。
HelloWorld.asm源文件的内容如下所示: [Asm] 纯文本查看 复制代码 ; include user32.inc
; include kernel32.inc
includelib user32.lib
includelib kernel32.lib
extern MessageBoxA:proc ; 如果包含了user32.inc头文件,则不需要extern引入该函数
extern ExitProcess:proc ; 如果包含了kernel32.inc头文件,则不需要extern引入该函数
.data
szText db 'Hello World!', 0
szCaption db 'Title', 0
.code
WinMain proc
sub rsp, 28h
xor r9d, r9d
mov r8, offset szCaption
mov rdx, offset szText
xor rcx, rcx
call MessageBoxA
xor ecx, ecx
call ExitProcess
add rsp, 28h ; 实际上执行完ExitProcess函数以后,这里不会得到执行
ret
WinMain endp
end
; 也可以使用以下命令编译
; ml64 /c HelloWorld.asm
; link /subsystem:windows /entry:WinMain HelloWorld.obj
Ctrl + F5编译运行,提示“LNK2001 无法解析的外部符号 WinMainCRTStartup”,这里需要设置一下入口点函数为WinMain。右键解决方案资源管理器中的项目名称“HelloWorld” → 属性(R) → 打开“HelloWorld 属性页”对话框 → 配置属性 → 链接器 → 高级 → 入口点,输入“WinMain”,点击“确定”按钮。再次编译运行即可成功,如果需要切换为Releasex64,同样需要再设置一次入口点。
|