【问题标题】:How to build x64 assembly project in visual studio 2017/2019如何在 Visual Studio 2017/2019 中构建 x64 组装项目
【发布时间】:2020-04-27 10:47:12
【问题描述】:

当我将“调试”设置为“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 位”寄存器,它也会失败

【问题讨论】:

    标签: visual-studio assembly x86-64


    【解决方案1】:

    首先请看我的文章"How to build a x64/x86-project with a standalone x64/x86 assembly file"

    让我们一一浏览错误信息(您可以通过双击错误信息将光标移动到错误行):

    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 调用约定(not C、BASIC、FORTRAN、PASCAL、SYSCALL 或 STDCALL)。

    A2008 syntax error : . test main.asm 3

    指令.STACK 是MS-DOS 时代的遗物。如果你用 ML for Windows 组装它是没用的(看看here)。在 ML64 中是不允许的。

    A2008 syntax error : , test main.asm 4

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

    A2008 syntax error : INVOKE test main.asm 16

    指令 INVOKE 在 ML64 中是不允许的(目前)。用CALL代替INVOKE,按照Microsoft x64 calling convention填写寄存器:

    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 入口点。删除“主要”。这也消除了第二个错误。根据my article在Visual Studio链接器选项中设置入口点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 2021-02-04
      • 2020-09-04
      • 1970-01-01
      • 2019-09-30
      • 2020-01-30
      • 1970-01-01
      相关资源
      最近更新 更多