You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Visual Studio中含ptr变量的C2400汇编语法错误?

解决C++内嵌x86汇编的C2400语法错误

你的代码触发C2400错误的原因是汇编第2行lea edi, [ptr]的语法不符合MSVC内嵌汇编规则——编译器无法正确解析[ptr]作为操作数的类型,从而报错"found 'PTR'"。

关键修改点

将原代码中:

lea edi, [ptr]
mov edi, [edi]

替换为:

mov edi, ptr

因为ptr本身就是指向vector数据缓冲区的指针变量,直接将其值(内存地址)加载到edi寄存器即可,无需通过lea取地址再间接访问。

修改后的完整代码

void primosx86(int n, vector<int>& primos) {
    primos.resize(n);               
    int* ptr = primos.data();       

    __asm {
        mov ecx, n
        mov edi, ptr
        mov esi, 2
        outer_loop:
            mov eax, esi
            mov ebx, 2
            inner_loop :
                cmp ebx, eax
                jge is_prime
                mov edx, 0
                div ebx
                cmp edx, 0
                je not_prime
                inc ebx
                jmp inner_loop

            is_prime :
                mov[edi], eax
                add edi, 4
                dec ecx
                jz finished
            not_prime :
                inc esi
                jmp outer_loop

            finished :
    }
}

额外注意事项

  • 该代码仅适用于MSVC编译器,__asm是MSVC特有的内嵌汇编语法,GCC/Clang需使用asm()格式且语法差异较大。
  • 确保项目编译架构为32位x86,代码中使用的是32位通用寄存器,64位编译环境下会出现寄存器不匹配的错误。

内容的提问来源于stack exchange,提问作者SISPLAU

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 21:07:36