// 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;
}
Run Code Online (Sandbox Code Playgroud)
请检查上面的代码.事实上,我想,sp()将通过esp-> eax返回esp寄存器值.但为什么?sp()的默认返回值是eax?谁能告诉我更多关于它的事?谢谢!
处理器体系结构组织参数,调用和返回(以及系统调用内核)(即调用约定)的方式在ABI(应用程序二进制接口)中进行了规范.对于x86-64上的Linux,您应该阅读x86-64 ABI文档.是的,返回a的函数的返回值long是通过%eaxx86-64.(还有X32 ABI)
请注意,它通常是常规的,但如果约定发生更改,则需要更改编译器,可能是链接器,内核和所有库.实际上,处理器制造商正在设计具有现有ABI的芯片(例如%esp寄存器的重要性,SYSENTER指令......)是非常重要的.