c - 重定向 lcc 编译器 : passing structure arguments

标签 c compiler-construction stack calling-convention lcc

我正在尝试为自定义虚拟机重新定位 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 xy 的地址正确引用了它们的字段(即生成的地址是 &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/

相关文章:

c - 使用 fscanf 读取文件失败

c# - 为什么 c# 中没有 "is not"关键字?

c++ - VS2005 如何强制所有指针访问不对齐?

c - 在堆栈上创建 char** 缓冲区的更好方法?

c - 为什么永远不会到达断点?

c - 如何将文件的编号存储在整数数组中

c - 在 C 中使用 openssl 生成 pem

visual-c++ - 编译 x64 代码时, "x86_amd64"和 "amd64"有什么区别?

c - 当您访问前一个堆栈变量时会发生什么?

ruby : stack level too deep (SystemStackError)