コーディングの競争に参加するときにスタックオーバーフローを回避するために、次のコードを使用することがあります。
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):);
が、うまくいくようですか?