C++ C+中的内联汇编+;带返回语句的函数

C++ C+中的内联汇编+;带返回语句的函数,c++,gcc,inline-assembly,C++,Gcc,Inline Assembly,考虑以下代码: #包括 int get_value(){asm(“movl$254,%eax”);} int main(){printf(“%d\n”,get_value());} 现在,如果使用g++main.cpp编译此代码,则会收到编译器警告(但代码仍在编译): 表示如果编译器使用上述代码生成二进制文件,则所有赌注都是无效的。(返回类型为int的函数没有返回语句) 事实上,当编译此代码时启用了优化功能g++-O3 main.cpp,此程序会立即发现故障 我的问题是,如何在C++函数中从内

考虑以下代码:

#包括
int get_value(){asm(“movl$254,%eax”);}
int main(){printf(“%d\n”,get_value());}
现在,如果使用
g++main.cpp
编译此代码,则会收到编译器警告(但代码仍在编译):

表示如果编译器使用上述代码生成二进制文件,则所有赌注都是无效的。(返回类型为int的函数没有返回语句)

事实上,当编译此代码时启用了优化功能
g++-O3 main.cpp
,此程序会立即发现故障


我的问题是,如何在C++函数中从内联程序集返回,与C++一致,并且没有得到此警告,代码工作正常。p> 我认为您需要做的是声明一个伪变量,并使用gcc扩展语法输出该变量,然后返回该变量。乐观主义者应该把两个赋值项都去掉

这有点像是在中解释的,可能是这样的:

#include <cstdio>

int get_value() {
  int b;
  asm("movl $254, %0;"
      : "=r"(b)
      );
  return b;
}

int main() {
  printf("%d\n", get_value());
}
#包括
int get_值(){
int b;
asm(“movl$254,%0
:“=r”(b)
);
返回b;
}
int main(){
printf(“%d\n”,get_value());
}

如果要机器代码与C一起使用,C++被设计为在抽象机器上工作。因此,在用C编译这些之后,您可以使用Extn“C”将这些方法导入C++。如果您忽略了C++所适用的事实,并与非标准进行交互,则使用调用约定,CDDEL应该是您所要查找的,不能仅仅从非->代码> VoUT/CODE>函数的结尾(只有MSVC的笨拙/坏代码),ASM{{} /代码>允许作为黑客攻击)。当然,当GCC内联您的函数时,这会中断。另外,不要对编译器撒谎:您没有告诉它就销毁了EAX。有关教程,请参见。这就是原因。你介意编辑你的答案以包含正确的代码吗。谢谢。如果你使用扩展语法,它是C++兼容还是GCC专用?@ ChIPST不是。正如本页所述:,对于不同的平台,所有编译器都有不同的约定。就我的情况而言,我希望它能与gcc和linux一起工作,这是可行的。我认为这是“实现定义的”,而不是像我的原始代码那样的“未定义的行为”。啊,好的。这是有道理的。多亏了“Lightness Races BY-SA 3.0”这个例子。我只是引用了文档,手头没有一个好的例子。
#include <cstdio>

int get_value() {
  int b;
  asm("movl $254, %0;"
      : "=r"(b)
      );
  return b;
}

int main() {
  printf("%d\n", get_value());
}