Я не уверен, что делает эта встроенная сборка:
asm ("mov %%esp, %0" : "=g" (esp));
особенно часть : "= g" (esp) .
: "= g" (esp)