如何解决带有MASM代码的Visual Studio C / C ++项目会产生错误“错误A2008:语法错误:”
我有一个Visual Studio C / C ++项目,其中有一个程序集文件main.asm
。在构建项目的过程中,我得到以下错误:
1>main.asm(5): error A2008: Syntax error : . 1>main.asm(6): error A2008: Syntax error : . 1>main.asm(7): error A2008: Syntax error : . 1>main.asm(8): error A2008: Syntax error :,1>main.asm(20): error A2008: Syntax error : INVOKE
我的 main.asm 代码是:
; program 3.1
; sample Assembly program - MASM (32-bit)
.386 ; Line 5
.MODEL FLAT,stdcall ; Line 6
.STACK 4096 ; Line 7
ExitProcess PROTO,dwExitCode:DWORD ; Line 8
.data
sum DWORD 0
.code
_main PROC
mov eax,25
mov ebx,50
add ebx,ebx
mov sum,eax
INVOKE ExitProcess,0 ; Line 20
_main ENDP
END
解决方法
根据您在以.MODEL
,.STACK
和.386
开头的行中显示的错误,我只能得出的结论是,您正在为64位目标而不是32位目标。您也可能还会收到与INVOKE
指令相关的错误。这些指令均不受64位MASM支持,因此会产生错误。在64位代码中,始终假定模型为平面模型,并且CDECL,STDCALL,THISCALL,FASTCALL等的调用约定都相同,并遵循Windows 64-bit Calling Convention。
您有两种选择:
-
构建32位应用程序。在Visual Studio中,作为菜单栏的一部分,有一个用于平台的下拉框。通过将
x64
更改为x86
,可以在工具栏中调整平台: -
修改代码以使用64位代码。要构建64位版本,您必须将
INVOKE
替换为CALL
,并且必须使用Windows 64-bit calling convention。您可以删除.STACK
,.MODEL
和.386
伪指令。通过用EXTERN
类型声明PROC
来修改外部过程的定义。该代码可能类似于:; program 3.1 ; sample Assembly program - MASM (64-bit) extern ExitProcess:PROC public mainCRTStartup .data sum DWORD 0 .code mainCRTStartup PROC ; Use mainCRTStartup if making a CONSOLE app without ; any C/C++ files AND if you haven't overridden the ; ENTRY point in the Visual Studio Project. sub rsp,8+32 ; Align stack on 16 byte boundary and allocate 32 bytes ; of shadow space for call to ExitProcess. Shadow space ; is required for 64-bit Windows Calling Convention as ; is ensuring the stack is aligned on a 16 byte boundary ; at the point of making a call to a C library function ; or doing a WinAPI call. mov eax,25 mov ebx,50 add ebx,ebx mov sum,eax xor ecx,ecx ; Set Error Code to 0 (RCX is 1st parameter) call ExitProcess mainCRTStartup ENDP END
对于您的环境,入口点可能会有所不同,具体取决于您是要创建GUI还是CONSOLE应用程序,以及项目中是否存在C / C ++文件。
与32位Windows代码不同,不需要以下划线开头的64位调用约定中的函数名称。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。