Linux ASM链接是指堆栈还是寄存器?

Linux ASM链接是指堆栈还是寄存器?,linux,gcc,linux-kernel,x86,function-attributes,Linux,Gcc,Linux Kernel,X86,Function Attributes,在大多数语言中,堆栈中包含的C用于函数调用。这就是为什么如果在递归中不小心会出现堆栈溢出错误。双关语不是有意的 如果这是真的,那么ASMGCC指令有什么特别之处呢 上面写着,从 链接标签是我们应该注意的另一件事 这是一个简单的函数。这是对一些gcc魔术的定义,它告诉我们 编译器提示函数不应期望找到其 中的参数注册通用优化,但仅在CPU的 堆叠 我的意思是,我不认为在正常的函数调用中使用寄存器 更奇怪的是,当你知道它是 文件如下: 在x86-32目标上,regparm属性使编译器通过 如果参数是中

在大多数语言中,堆栈中包含的C用于函数调用。这就是为什么如果在递归中不小心会出现堆栈溢出错误。双关语不是有意的

如果这是真的,那么ASMGCC指令有什么特别之处呢

上面写着,从

链接标签是我们应该注意的另一件事 这是一个简单的函数。这是对一些gcc魔术的定义,它告诉我们 编译器提示函数不应期望找到其 中的参数注册通用优化,但仅在CPU的 堆叠

我的意思是,我不认为在正常的函数调用中使用寄存器

更奇怪的是,当你知道它是

文件如下:

在x86-32目标上,regparm属性使编译器通过 如果参数是中的整型参数,则为1到数 注册EAX、EDX和ECX,而不是在堆栈上

这基本上与阿斯曼正在尝试做的相反

那么会发生什么呢?它们是在堆栈上还是在寄存器上

我哪里做错了


信息不是很清楚。

通常,为了根据体系结构更快地调用,编译器可以选择通过寄存器传递一些参数,以避免每次都将它们复制到堆栈中。对于未导出的私有函数尤其如此,因此不需要遵守ABI定义的调用约定,以便进一步优化

有些ABI实际上需要在寄存器中传递参数。Linux x86-64上的System V AMD64 ABI调用约定默认值就是一个很好的例子:它规定函数参数应该通过RDI、RSI、RDX、RCX、R8、R9、[XYZ]MM0–7传递,因此很少使用堆栈

现在,在Linux中进行系统调用时,内核复制堆栈上的用户空间寄存器以保留它们,然后调用适当的系统调用函数。这些函数应直接从堆栈上已保存的用户寄存器获取参数,因此必须编译为仅从堆栈获取参数,并且始终从堆栈获取参数


在x86 32位中,asmlinkage宏_属性_regparam0基本上告诉GCC不应通过寄存器传递任何参数。0是重要的部分。在x86 64位上,它使用更具体的_属性_系统调用_链接。最终结果是一样的:函数被迫从堆栈中获取参数。在其他总是在堆栈上传递参数的体系结构上,甚至不需要特殊的_属性。

因此,您所说的基本上是,在正常情况下,函数可以在堆栈上或寄存器中。ASM链接只保证它们始终在堆栈上。我说的对吗?@ng.newbie是的,没错。