如何在 Visual Studio 2017/2019 中构建 x64 汇编项目

Lan*_*cer 2 assembly x86-64 visual-studio

当我将“调试”设置为“x86”时,以下代码有效

.386
.model flat, stdcall
.stack 4096
ExitProcess PROTO, dwExitCode: DWORD

.data
     ; define your variables here
.code

main PROC
    ; write your assembly code herer
    mov eax ,3
    mov ebx ,8
    add eax, ebx

   INVOKE ExitProcess ,0
main ENDP
END main
Run Code Online (Sandbox Code Playgroud)

但当我将“x86”更改为“x64”时不起作用 你

如果我尝试像 rax 一样使用“64位”寄存器,它也会失败

rkh*_*khb 5

首先,请看我的文章“如何使用独立的 x64/x86 程序集文件构建 x64/x86 项目”

我们来一一查看错误信息(可以通过双击错误信息将光标移动到错误行):

A2008 syntax error : . test main.asm 1

伪指令.386仅允许在 32 位 MASM (ML.EXE) 中使用。ML64 (ML64.EXE) 中不允许这样做。ML64“知道”它能知道的所有指令。

A2008 syntax error : . test main.asm 2

伪指令.MODEL仅允许在 32 位 MASM (ML.EXE) 中使用。ML64 (ML64.EXE) 中不允许这样做。ML64 默认使用平面模型和 x64 调用约定(不是C、BASIC、FORTRAN、PASCAL、SYSCALL 或 STDCALL)。

A2008 syntax error : . test main.asm 3

.STACK指令是 MS-DOS 时代的遗物。如果你用 Windows 的 ML 来组装,那就没用了(看这里)。ML64 中不允许这样做。

A2008 syntax error : , test main.asm 4

在指令PROTO中,ML64 不喜欢 PROTO 关键字和第一个参数之间的逗号。去掉它。

A2008 syntax error : INVOKE test main.asm 16

ML64 中尚不允许指令INVOKE 。将 INVOKE 替换为 CALL 并根据Microsoft x64 调用约定填写寄存器:

mov ecx, 0
call ExitProcess
Run Code Online (Sandbox Code Playgroud)

A2008 syntax error : main test main.asm 18 A2088 END directive required at end of file test main.asm 18

指令END不得包含 ML64 的附加入口点。删除“主”。这也消除了第二个错误。根据我的文章在 Visual Studio 链接器选项中设置入口点。