特别是在 SysV x86-64 ABI的上下文中
如果我有一个只有两个字段的结构,例如:
typedef struct {
void *foo;
void *bar;
} foobar_t;
我将它传递给一个定义如下的函数:
foobar_t example_function(foobar_t example_param);
ABI 似乎说每个八字节字段都应该传递INTEGER
给函数,因此rdi == foo
and rsi == bar
。同样,在返回时我们应该能够使用rax
and rdx
,因为我们不需要在rdi
. Ifexample_function
被简单地定义为:
foobar_t example_function(foobar_t example_param) {
return example_param;
}
一个有效的程序集实现,忽略序言和结尾,将是:
example_function:
mov rax, rdi
mov rdx, rsi
ret
可以想象,一个精神上有缺陷的编译器可以用填充填充结构NO_CLASS
并以某种方式使该程序集无效。我想知道它是否写在必须以这种方式处理只有两个八字节字段的结构的任何地方。
我的问题的更大背景是我正在编写一个简单的 C11 任务切换器以供我自己启迪。我主要基于 boost.context ,这正是 boost 传递两个字段结构的方式。我想知道它是否在所有情况下都是犹太洁食,或者 boost 是否有点作弊。