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

时间:2012-10-06 16:29:37

标签: 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;  
}

请检查以上代码。事实上,我想sp()将通过esp-> eax返回esp寄存器值。但为什么? sp()的默认返回值是eax? 谁能告诉我更多关于它的事?谢谢!

3 个答案:

答案 0 :(得分:5)

处理器体系结构组织参数,调用和返回(以及syscalls到内核)(即calling conventions)的方式在ABI(应用程序二进制接口)中进行了特定。对于x86-64上的Linux,您应该阅读x86-64 ABI文档。是的,返回long的函数的返回值是x86-64上的%eax。 (还有X32 ABI

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

答案 1 :(得分:2)

这是规则!

GCC用于32位汇编的调用约定用于将整数返回函数的返回值作为%eax中的值。 GCC也将其用于内联汇编功能。

有关所有详细信息,请参阅Wikipedia

答案 2 :(得分:-1)

IIRC正确的命令应该是“mov eax,esp”而不是“mov esp,eax”。

unsigned long sp(void){ __asm__("mov %eax, %esp");}