内联简单的汇编函数

时间:2013-11-27 00:35:35

标签: gcc assembly x86 inline-assembly inlining

我(试图)跟随an old answer,但我必须做错事:函数没有内联(它仍然在反汇编中调用)。这是我做的:

get_regs.h:
    inline unsigned long __get_esp(void) {
    __asm__("movl %esp,%eax");
    }

program.c:
    ...
    #include "get_regs.h "
    ...
    extern unsigned long __get_esp(void);
    ...
    tmp = __get_esp();

编译为(出于各种原因的其他选项):
gcc -g -fno-stack-protector -mpreferred-stack-boundary=2 program.c

这是在第二个建议中将定义包含在头文件中。

我意识到我可以使用扩展程序集并将结果从%eax复制到tmp,但我想了解内联。我在SO上发现了一些点击,但似乎没有一个能够覆盖我的情况。

系统:
- Ubuntu 12.04
- gcc 4.6.3。
- x86 32位

1 个答案:

答案 0 :(得分:3)

您需要启用编译器优化(甚至是最基本的级别)才能进行内联。

顺便说一句,除非您对函数的非内联副本有任何特殊需要,否则可以删除extern重新声明,并使用头文件中包含的内联声明。