带有 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());
}
考虑这段代码:
#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"); }
|
确实,当在打开优化的情况下编译此代码时 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());
}