带有 return 语句的 C++ 函数中的内联汇编

inline assembly in C++ function with return statement

考虑这段代码:

#include <cstdio>

int get_value() { asm("movl 4, %eax"); }

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

现在,如果使用 g++ main.cpp 编译此代码,则会收到编译器警告(但代码仍可编译):

main.cpp: In function ‘int get_value()’:
main.cpp:3:43: warning: no return statement in function returning non-void [-Wreturn-type]
    3 | int get_value() { asm("movl 4, %eax"); }
      |                                    

表示,如果编译器生成带有上述代码的二进制文件,则一切皆有可能。 (没有来自具有 return 类型 int 的函数的 return 语句)

确实,当在打开优化的情况下编译此代码时 g++ -O3 main.cpp,此程序会立即出现段错误。

所以我的问题是如何在符合 C++ 的 c++ 函数中 return 进行内联汇编,并且没有收到此警告,并且代码运行良好。

我相信你要做的就是声明一个虚拟变量,然后使用 gcc 扩展语法输出那个变量,然后你就可以 return 这个变量了。优化器应该 去掉两个分配器。

它在 https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s5 中有某种解释,可能看起来像这样:

#include <cstdio>

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

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