// gcc -g stack.c -o stack
//
unsigned long sp(void){ __asm__("mov %esp, %eax");}
int main(int argc, char **argv)
{
unsigned long esp = sp();
printf("Stack pointer (ESP : 0x%lx)\n",esp);
return 0;
}
请检查以上代码。事实上,我想sp()将通过esp-> eax返回esp寄存器值。但为什么? sp()的默认返回值是eax? 谁能告诉我更多关于它的事?谢谢!
答案 0 :(得分:5)
处理器体系结构组织参数,调用和返回(以及syscalls到内核)(即calling conventions)的方式在ABI(应用程序二进制接口)中进行了特定。对于x86-64上的Linux,您应该阅读x86-64 ABI文档。是的,返回long
的函数的返回值是x86-64上的%eax
。 (还有X32 ABI)
请注意,它通常是常规的,但如果约定更改,则需要更改编译器,可能是链接器,内核和所有库。实际上,处理器制造商在设计硅片时考虑到现有的ABI非常重要(例如%esp
寄存器的重要性,SYSENTER
指令......)。
答案 1 :(得分:2)
答案 2 :(得分:-1)
IIRC正确的命令应该是“mov eax,esp”而不是“mov esp,eax”。
unsigned long sp(void){ __asm__("mov %eax, %esp");}