【发布时间】:2013-03-27 10:41:49
【问题描述】:
有时我在参加编程比赛时使用下面的代码来避免堆栈溢出。
int main()
{
static const int _STACK_SIZE = MAXN*10;
static int _STACK[_STACK_SIZE*2], _ESP;
__asm__ __volatile__
(
"movl %%esp, %0\n"
"movl %1, %%esp\n":
"=g"(_ESP):
"g"(_STACK + _STACK_SIZE):
);
// Do Something..
__asm__ __volatile__
(
"movl %0, %%esp\n":
:
"g"(_ESP):
);
}
据我所知,这个 asm 代码备份 %esp 并将堆栈移动到 _STACK[]。
我的问题:为什么这段代码会在 x86-64 Linux 服务器上导致 SIGSEGV(它在我自己的 x86 Linux 上运行良好)?以及如何解决?
我猜,可能是因为%esp是一个64位指针??
我试图删除__asm__ __volatile__("movl %0, %%esp\n": : "g"(_ESP):);,它似乎运行良好?
【问题讨论】:
标签: linux assembly g++ 64-bit x86-64