我试图获得在C当前堆栈指针时(使用内联ASM)碰到一些奇怪的行为。代码如下:获取堆栈指针用C在Mac OS X Lion的
$ g++ test.cc -o test
它产生下面的汇编:
#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
如果我运行生成的二进制它使用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'指针? –
检查了原始代码,并将其声明为静态,并且更新了该问题。我只是在做一些现有的代码。大多数用例使用不等式,所以如果该值稍微偏离,那么它不是太多问题。对我来说关键的问题是非法指令的例外。 –