gpt4 book ai didi

visual-studio - 具有 MASM 代码的 Visual Studio C/C++ 项目产生错误 `error A2008: syntax error : .`

转载 作者:行者123 更新时间:2023-12-02 19:10:50 26 4
gpt4 key购买 nike

我有一个带有单个程序集文件的 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

我的ma​​in.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

包含我的代码和错误的 Visual Studio 屏幕截图:

 /image/VCtKg.jpg

为什么我会收到这些错误以及如何修复它们?

最佳答案

根据您在以 .MODEL.STACK.386 开头的行上显示的错误,我只能收集到您正在构建 64 位目标而不是 32 位目标。您可能还收到与 INVOKE 指令相关的错误。 64 位 MASM 不支持这些指令,因此会生成错误。在 64 位代码中,模型始终被假定为平坦的,并且 CDECL、STDCALL、THISCALL、FASTCALL 等的调用约定都是相同的,并遵循 Windows 64-bit Calling Convention .

你有两个选择:

  • 构建 32 位应用程序。在 Visual Studio 中,作为菜单栏的一部分,有一个平台的下拉框。可以在工具栏中将 x64 更改为 x86 来调整平台:

    enter image description here

  • 修改代码以使用 64 位代码。要构建 64 位,您必须将 INVOKE 替换为 CALLWindows 64-bit calling convention必须使用。您可以删除 .STACK.MODEL.386 指令。通过使用 PROC 类型声明 EXTERN 来修改外部过程的定义。代码可能类似于:

    ; 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 位调用约定中的函数名称不需要以下划线开头。

关于visual-studio - 具有 MASM 代码的 Visual Studio C/C++ 项目产生错误 `error A2008: syntax error : .`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64302264/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com