我正在尝试为自定义虚拟机重新定位 lcc。我在将结构作为参数(按值)传递时遇到问题。 VM的堆栈从低地址向高地址增长。为参数生成的结构字段的偏移量不正确。
例如,对于下面的代码:
foo(sample p, sample q);
struct sample
{
int a;
int b;
};
main()
{
sample x, y;
foo(x, y);
}
foo()
看到的结构体字段 a 和 b 位于地址 (&p
和 &p-4
) 和 (&q
和&q-4
)。这些应该是(&p
和 &p+4
)和(&q
和 &q+4
)。 main()
中 struct x
和 y
的地址正确引用了它们的字段(即生成的地址是 &x
、&x+4
和&y
、&y+4
)。我已经验证为 ARG+B 节点生成的代码是否正确复制了堆栈上传递的结构参数(复制的结构的基址从较低地址开始)。
如有任何帮助,我们将不胜感激。
最佳答案
您对编译器如何放置堆栈的观察通常会引起困惑。
堆栈可能会向任一方向增长,具体取决于系统。我的经验是,根据您对系统的观察(带有“x”和“y”),大多数从最高地址增长到最低地址。
结构中的值“a”和“b”是另一回事。编译器没有特权对它们重新排序。 C 规范要求这些在结构内按照定义进行排序。
因此,您的观察虽然令人惊讶,但却是正确的;并且编译器也运行正常。
(或者,也许我误解了所提供的细节?)
关于c - 重定向 lcc 编译器 : passing structure arguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23463616/