"内联汇编"代码的返回值是多少?

Tom*_*Xue 0 linux assembly

// 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?谁能告诉我更多关于它的事?谢谢!

Bas*_*tch 5

处理器体系结构组织参数,调用和返回(以及系统调用内核)(即调用约定)的方式在ABI(应用程序二进制接口)中进行了规范.对于x86-64上的Linux,您应该阅读x86-64 ABI文档.是的,返回a的函数的返回值long是通过%eaxx86-64.(还有X32 ABI)

请注意,它通常是常规的,但如果约定发生更改,则需要更改编译器,可能是链接器,内核和所有库.实际上,处理器制造商正在设计具有现有ABI的芯片(例如%esp寄存器的重要性,SYSENTER指令......)是非常重要的.