Cで現在のスタックポインタを取得しようとしたときに奇妙な動作が発生しました(インラインASMを使用)。コードは次のようになります。Mac OS X LionのCでスタックポインタを取得
#include <stdio.h>
class os {
public:
static void* current_stack_pointer();
};
void* os::current_stack_pointer() {
register void *esp __asm__ ("rsp");
return esp;
}
int main() {
printf("%p\n", os::current_stack_pointer());
}
私は標準のgccのオプションを使用してコードをコンパイルする場合:私は結果のバイナリを実行する場合
__ZN2os21current_stack_pointerEv:
0000000000000000 pushq %rbp
0000000000000001 movq %rsp,%rbp
0000000000000004 movq %rdi,0xf8(%rbp)
0000000000000008 movq 0xe0(%rbp),%rax
000000000000000c movq %rax,%rsp
000000000000000f movq %rsp,%rax
0000000000000012 movq %rax,0xe8(%rbp)
0000000000000016 movq 0xe8(%rbp),%rax
000000000000001a movq %rax,0xf0(%rbp)
000000000000001e movq 0xf0(%rbp),%rax
0000000000000022 popq %rbp
:
$ g++ test.cc -o test
をそれは、次のアセンブリを生成し、 SIGILL(不正命令)でクラッシュします。私はコンパイルに少し最適化を追加するただし場合:
$ g++ -O1 test.cc -o test
生成されたアセンブリは、はるかに簡単です:
0000000000000000 pushq %rbp
0000000000000001 movq %rsp,%rbp
0000000000000004 movq %rsp,%rax
0000000000000007 popq %rbp
0000000000000008 ret
そして、コードが細かい実行されます。だから質問に。 Mac OS X上のCコードからスタックポインタを取得する方が安定していますか?同じコードはLinuxでは問題ありません。
_function_call_は、スタックアドレスを得るために設計されたものではありません。 – zneak
さらに、なぜその関数は非静的クラスメソッド*ですか?あなたはおそらく 'this'ポインタのために何を望みますか? –
元のコードをチェックしたところ、静的であると宣言され、質問が更新されました。私はいくつかの既存のコードを作業しています。ほとんどのユースケースでは不等式が使用されるため、値がわずかに外れている場合はあまり問題になりません。私にとって重要な問題は、違法命令例外です。 –