我正在尝试为自定义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)。main()中结构x和y的地址正确地引用了它们的字段(即生成的地址是&x、&x+4和&y、&y+4)。我已经验证了为ARG+B节点生成的代码是否正确地复制了堆栈上传递的结构参数(复制的结构的基址从较低的地址开始)。
任何帮助都将不胜感激。
发布于 2014-05-05 11:25:37
您对编译器如何放置堆栈的观察通常会导致混淆。
堆栈可以在任一方向上增长,具体取决于系统。我的经验是,根据你在系统上的观察,大多数是从最高地址到最低地址(使用'x‘和'y')。
结构中的值'a‘和'b’是另一回事。编译器没有对它们重新排序的特权。C规范要求在结构中按照定义的顺序对它们进行排序。
因此,您的观察结果虽然令人惊讶,但却是正确的;编译器也在正常运行。
(或者,也许我误解了所提供的细节?)
https://stackoverflow.com/questions/23463616
复制相似问题