重定向lcc编译器:传递结构参数

时间:2014-05-05 01:41:07

标签: c compiler-construction stack calling-convention lcc

我正在尝试为自定义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中结构ymain()的地址正确引用其字段(即生成的地址为&x&x+4&y&y+4)。我已经验证了为ARG + B节点生成的代码正确地复制了堆栈上传递的struct参数(复制的struct的基础从较低的地址开始)。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您对编译器如何放下堆栈的观察经常会引起混淆。

堆栈可能会向任一方向增长,具体取决于系统。我的经验是,根据您在系统上的观察,大多数地址从最高地址到最低地址(使用' x'和' y')。

价值观' a'和' b'在结构内是另一回事。编译器没有对这些重新排序的特权。 C规范要求在结构中对它们进行排序,因为它们是定义的。

因此,您的观察虽然令人惊讶,但却是正确的;并且编译器也正常运行。

(或者,或许我误解了所提供的细节?)