C++内嵌汇编为std::string变量赋值时报操作数类型错误如何解决
错误原因
std::string是C封装的非平凡类类型,不是整型、指针这类可以直接用mov指令操作的原始数据类型:std::string的赋值需要调用类的拷贝赋值运算符,属于C层面的函数调用逻辑,无法通过单条mov指令完成,所以编译器会报操作数类型不匹配错误。- 内嵌汇编仅支持对**原始数据类型(指针、算术类型等)**直接做寄存器/内存操作,无法直接识别、操作C++类的成员函数和重载运算符逻辑。
解决方案
把预定义的三个提示字符串改为C风格的const char*原始指针类型,同时新增一个临时指针变量接收汇编分支的赋值结果,最后在C++层面把指针赋值给std::string输出即可,修改后的代码如下:
#include <iostream> #include <string> int main(){ double r; // 改为C风格字符串指针,方便汇编操作 const char* mNeg = "r is negative, r = ", * mPos = "r is positive, r = ", * mEqu = "r is equal to zero, r = "; // 新增临时指针变量,用于接收汇编赋值 const char* tmpOutput = nullptr; std::string mOutput; _asm{ // 这里保留你原有计算r的逻辑 // ... ;comparison equal: fld r ftst fstsw ax fwait sahf ja Jpos jb Jneg mov tmpOutput, mEqu ; 现在操作的是指针,mov可正常执行 jmp fin Jpos: mov tmpOutput, mPos jmp fin Jneg: mov tmpOutput, mNeg fin: } // C++层面把指针赋值给string,自动处理字符串拷贝 mOutput = tmpOutput; std::cout << mOutput << r; return 0; }
补充说明
如果一定要在汇编中操作std::string,需要手动解析std::string的内存布局、找到其内部存储字符串的指针偏移,再手动调用拷贝赋值运算符的函数地址,实现复杂度极高且完全依赖编译器、标准库的具体实现,兼容性极差,不推荐这种写法。
内容的提问来源于stack exchange,提问作者DGarciaBl
相关产品推荐
相关产品推荐

