Linux “;的返回值是多少;内联装配&x201D;代码?;

Linux “;的返回值是多少;内联装配&x201D;代码?;,linux,assembly,Linux,Assembly,请检查以上代码。事实上,我猜sp()将通过esp->eax返回esp寄存器值。但是为什么呢?sp()的默认返回值是eax? 谁能告诉我更多关于它的事?谢谢 处理器体系结构组织参数、调用和返回(以及到内核)的方式在ABI(应用程序二进制接口)中有详细说明。对于x86-64上的Linux,您应该阅读该文档。是的,在x86-64上,返回long的函数的返回值是通过%eax。(另有) 请注意,它基本上是传统的,但是如果约定发生了变化,您将需要更改编译器,可能是链接器、内核和所有库。实际上,处理器制造商在

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

处理器体系结构组织参数、调用和返回(以及到内核)的方式在ABI(应用程序二进制接口)中有详细说明。对于x86-64上的Linux,您应该阅读该文档。是的,在x86-64上,返回
long
的函数的返回值是通过
%eax
。(另有)


请注意,它基本上是传统的,但是如果约定发生了变化,您将需要更改编译器,可能是链接器、内核和所有库。实际上,处理器制造商在设计硅片时必须考虑到现有的ABI(例如,
%esp
寄存器、
syscenter
指令的重要性……)

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

请注意,它基本上是传统的,但如果约定发生变化,您将需要更改编译器,可能是链接器、内核和所有库。事实上,这一点非常重要,以至于处理器制造商在设计硅时考虑到了现有的ABI(例如,
%esp
寄存器,
syscenter
指令的重要性…。

这是规则

GCC对32位程序集使用的调用约定是将整数返回函数的返回值设置为
%eax
中的值。GCC对内联程序集函数也采用此约定

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

这是规则

GCC对32位程序集使用的调用约定是将整数返回函数的返回值设置为
%eax
中的值。GCC对内联程序集函数也采用此约定


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

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


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


在不同系统中调用约定的好资源也是关于调用约定的:在不同系统中调用约定的好资源也是关于调用约定的:gcc编译器使用“AT&T向后表示法”对于汇编,这意味着与Intel和Microsoft的汇编表示法相比,所有参数都是相反的。谢谢。我应该获得更多的经验。gcc编译器使用“AT&T向后表示法”对于汇编,意味着与Intel和Microsoft的汇编表示法相比,所有参数都是相反的。谢谢。那时我应该获得更多经验。内联是指GIMPLE级别的doe by GCC,远早于寄存器分配。内联是GIMPLE级别的doe by GCC,远早于寄存器分配。
// 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;  
}
unsigned long sp(void){ __asm__("mov %eax, %esp");}