如何在Visual Studio 2017/2019中构建x64组装项目

问题描述 投票:0回答:2

当我将'debug'设置为'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'时不起作用u

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

visual-studio assembly x86-64
2个回答
2
投票

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

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

A2008 syntax error : . test main.asm 1

仅在32位MASM(ML.EXE)中允许使用指令.386。在ML64(ML64.EXE)中是不允许的。 ML64“知道”它可以知道的所有指令。

A2008 syntax error : . test main.asm 2

仅在32位MASM(ML.EXE)中允许使用指令.MODEL。在ML64(ML64.EXE)中是不允许的。 ML64默认情况下使用平面模型和x64调用约定(not C,BASIC,FORTRAN,PASCAL,SYSCALL或STDCALL)。

A2008 syntax error : . test main.asm 3

指令.STACK是MS-DOS时代的遗物。如果您使用Windows的ML进行组装,则没有用(请看here)。 ML64中不允许。

A2008 syntax error : , test main.asm 4

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

A2008 syntax error : INVOKE test main.asm 16

ML64尚未允许指令INVOKE(尚未)。用CALL代替INVOKE并根据Microsoft x64 calling convention填写寄存器:

mov ecx, 0
call ExitProcess

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

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


-3
投票

[如果阅读https://docs.microsoft.com/en-us/cpp/assembler/inline/inline-assembler?view=vs-2019,您会注意到诸如“ ARM和x64处理器不支持嵌入式汇编”之类的文本。哪个应该回答您问题的“为什么”部分。

© www.soinside.com 2019 - 2024. All rights reserved.