Linux “;的返回值是多少;内联装配&x201D;代码?;
请检查以上代码。事实上,我猜sp()将通过esp->eax返回esp寄存器值。但是为什么呢?sp()的默认返回值是eax?Linux “;的返回值是多少;内联装配&x201D;代码?;,linux,assembly,Linux,Assembly,请检查以上代码。事实上,我猜sp()将通过esp->eax返回esp寄存器值。但是为什么呢?sp()的默认返回值是eax? 谁能告诉我更多关于它的事?谢谢 处理器体系结构组织参数、调用和返回(以及到内核)的方式在ABI(应用程序二进制接口)中有详细说明。对于x86-64上的Linux,您应该阅读该文档。是的,在x86-64上,返回long的函数的返回值是通过%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");}