Back

/ 2 min read

使用 Visual Studio 进行x86汇编环境配置

下载MASM32

下载地址

下载后安装到D:\masm32目录下。

头文件在D:\masm32\include目录下。 静态库在D:\masm32\lib目录下。

配置Visual Studio

新建一个工程,选择空项目

选择生成依赖项

选择MASM32

创建一个main.asm文件,输入以下代码:

.686
.model flat, stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
.data
szText db "Hello World", 0
.code
start:
invoke MessageBoxA, NULL, addr szText, addr szText, MB_OK
invoke ExitProcess, 0
end start

配置头文件路径

此时就可以编译了。

使用C库函数配置

修改代码,静态链接CRT库。

.686
.model flat, stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
; 静态链接CRT库
includelib libcmt.lib
includelib libvcruntime.lib
includelib libucrt.lib
.data
szText db "Hello World", 0
.code
main proc c
invoke MessageBoxA, NULL, addr szText, addr szText, MB_OK
invoke ExitProcess, 0
main endp
end

创建一个stdc.inc头文件,用来声明CRT函数。

.686
option casemap :none
; 主要用来声明一些C运行时库的函数
ifndef _stdc_inc
_stdc_inc EQU 1
fgets proto c :DWORD, :DWORD, :DWORD
fprintf proto c :DWORD, :DWORD, :VARARG
; 0:stdin, 1:stdout, 2:stderr
__acrt_iob_func proto c :DWORD ; 因为没有stdin, stdout, stderr这些文件指针,所以需要通过这个函数获取
endif

完整代码:

.686
.model flat, stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
include stdc.inc
includelib libcmt.lib
includelib libvcruntime.lib
includelib libucrt.lib
.data
szText db "Hello World", 0
.code
main proc c
local @stdin:DWORD
local @stdout:DWORD
local @input_buf[100]: BYTE
invoke __acrt_iob_func, 0h
mov @stdin, eax
invoke __acrt_iob_func, 1h
mov @stdout, eax
invoke fgets, addr @input_buf, 100, @stdin
invoke fprintf, @stdout, addr @input_buf
invoke ExitProcess, 0
main endp
end