2

当我将“调试”设置为“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

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

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

4

1 回答 1

4

首先,请看一下我的文章“如何使用独立的 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 时代的遗物。如果你用 ML for Windows 组装它是没用的(看这里)。在 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

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

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

于 2020-01-10T08:58:56.097 回答