有时我在参加编码比赛时使用以下代码来避免堆栈溢出。
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[]
.
我的问题:为什么这个代码会SIGSEGV
在 x86-64 Linux 服务器上引起(它在我自己的 x86 Linux 上运行良好)?以及如何解决?
我想,也许是因为%esp
是 64 位指针?
我试图删除__asm__ __volatile__("movl %0, %%esp\n": : "g"(_ESP):);
它,它似乎运行良好?