1

私は古い答えに従おうとしましたが、何か間違ったことをしているに違いありません:関数はインライン化されていません(逆アセンブリでまだ呼び出されています)。これが私がしたことです:

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

これは、ヘッダー ファイルに定義を含めるという 2 番目の推奨事項に従います。

拡張アセンブリを使用して結果を から にコピーできることは%eaxわかっtmpていますが、インライン化を行うことを理解したいと思います。SOでいくつかのヒットを見つけましたが、私のケースをカバーしているようには見えませんでした。

システム:
- Ubuntu 12.04
- gcc 4.6.3。
- x86 32 ビット

4

1 に答える 1

3

インライン化を行うには、コンパイラの最適化 (最も基本的なレベルでも) を有効にする必要があります。

ところで、関数のインライン化されていないコピーが特別に必要でない限り、extern 再宣言を削除して、ヘッダー ファイルに含まれているインライン化された宣言のみを使用できます。

于 2013-11-27T01:22:28.667 に答える