在大多数语言中,C 包括堆栈用于函数调用。这就是如果您在递归时不小心会收到“堆栈溢出”错误的原因。(不是双关语)。
如果这是真的,那么asmlinkageGCC 指令有什么特别之处。
它说,来自#kernelnewbies
asmlinkage 标签是我们应该注意的关于这个简单函数的另一件事。这是一些 gcc 魔法的 #define,它告诉编译器该函数不应期望在寄存器中找到它的任何参数(一种常见的优化),而只能在 CPU 的堆栈上。
我的意思是我不认为寄存器用于正常的函数调用。
更奇怪的是,当你了解到它是在 x86 上使用 GCC regparm 函数属性实现的。
regparm的文档如下:
在 x86-32 目标上,如果参数在寄存器 EAX、EDX 和 ECX 中而不是在堆栈中是整数类型,则 regparm 属性会导致编译器将第一个参数传递给 number。
这基本上与asmlinkage正在尝试做的相反。
那么会发生什么?它们是在堆栈上还是在寄存器上。
我哪里错了?
信息不是很清楚。