我正在尝试为自定义VM重新定位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
)。 x
中结构y
和main()
的地址正确引用其字段(即生成的地址为&x
,&x+4
和&y
,&y+4
)。我已经验证了为ARG + B节点生成的代码正确地复制了堆栈上传递的struct参数(复制的struct的基础从较低的地址开始)。
任何帮助将不胜感激。
答案 0 :(得分:1)
您对编译器如何放下堆栈的观察经常会引起混淆。
堆栈可能会向任一方向增长,具体取决于系统。我的经验是,根据您在系统上的观察,大多数地址从最高地址到最低地址(使用' x'和' y')。
价值观' a'和' b'在结构内是另一回事。编译器没有对这些重新排序的特权。 C规范要求在结构中对它们进行排序,因为它们是定义的。
因此,您的观察虽然令人惊讶,但却是正确的;并且编译器也正常运行。
(或者,或许我误解了所提供的细节?)