当我将'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
如果我尝试使用像rax这样的'64bit'寄存器,它也会失败
首先,请看一下我的文章"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 18
A2088 END directive required at end of file test main.asm 18
指令END不得包含ML64的附加入口点。删除“主要”。这也消除了第二个错误。根据my article在Visual Studio链接器选项中设置入口点。
[如果阅读https://docs.microsoft.com/en-us/cpp/assembler/inline/inline-assembler?view=vs-2019,您会注意到诸如“ ARM和x64处理器不支持嵌入式汇编”之类的文本。哪个应该回答您问题的“为什么”部分。