2

我正在尝试为自定义 VM 重新定位 lcc。将结构作为参数(按值)传递时遇到问题。VM 的堆栈从低地址到高地址增长。为参数错误地生成了结构字段的偏移量。

例如,对于下面的代码:

foo(sample p, sample q); 

struct sample 
{ 
    int a; 
    int b; 
}; 
main() 
{ 
    sample x, y; 
    foo(x, y); 
} 

如上所示,结构字段 a 和 bfoo()位于地址 ( &pand &p-4) 和 ( &qand &q-4)。这些应该是 ( &pand &p+4) 和 ( &qand &q+4)。structxyin的地址main()正确地引用了它们的字段(即生成的地址是&x,&x+4&y, &y+4)。我已经验证为 ARG+B 节点生成的代码正确地复制了堆栈上传递的结构参数(复制的结构的基址从低地址开始)。

任何帮助,将不胜感激。

4

1 回答 1

2

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

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

结构中的值“a”和“b”是另一回事。编译器没有重新排序这些的特权。C 规范要求这些在结构中按定义进行排序。

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

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

于 2014-05-05T03:25:36.593 回答