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