如何解决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
相关产品推荐
相关产品推荐

