编译器支持数组|形式参数

时间:2018-04-27 14:14:00

标签: arrays parsing compiler-construction

我被要求在编译器中基本上从头开始实现数组,该编译器编译C语言(实际上语言是C的严格子集)。但我认为这对这个问题并不重要。

我扩展了扫描程序和解析器,一切都适用于全局和本地数组(甚至是多维数组)。基本上我为数组的每个条目分配8个字节,例如arr [10]将是80字节的分配。对于寻址和赋值,我使用行主算法。

如前所述,本地和全局数组工作正常。但是,我没有将数组作为正式参数来工作。

所以例如

int test (int a[10]);



 int main() {
  int array[10];
  int i;
  i = 0;
  while(i < 10) {
    array[i] = i;
    i = i + 1;
  }
  return test(array);
}

int test (uint64_t a[10]) {
  return a[7];
}

这里的问题是方法的声明(第一行)为堆栈上的形式参数(在我的实现中工作)保留了内存。但是堆栈具有LIFO结构,这意味着变量以与定义相反的顺序存储。

所以我的

return a[7];

应返回值7.但由于在堆栈中项目的顺序不同,我的值以这种方式存储

a[-9] == 0;
a[-8] == 1;
a[-7] == 2;
a[-6] == 3;
.
.
.
a[-1] == 8;
a[0] == 9;

如果我使用全局或本地数组,我有数组开头的地址,然后通过某个偏移量增加该地址以访问某个元素(因为这是实现数据存储的方式)。在堆栈上,就我理解结果而言,这是另一种方式。

我的问题是堆栈从上到下增长,所以如果我有堆栈指针,变量必须存储在它上面。这意味着我不能只改变内存地址的符号。

那么如何在正确的索引上获取数组元素(而不是一些负指数)?

我希望这个问题在某种程度上是可以理解的。

1 个答案:

答案 0 :(得分:2)

  

但是堆栈有一个LIFO结构,这意味着变量以与定义相反的顺序存储。

这不会发生。唯一关于调用堆栈的LIFO就是堆栈帧的顺序,帧内发生的事情完全取决于你。在只有静态大小的局部变量的简单语言中,可以通过从堆栈指针中减去一些常数来分配所有这些变量所需的内存。当函数离开时,该分配被撤消,这就是LIFO的结果,但是对块中的变量没有强加顺序,特别是对这些变量的内部结构没有。

相关问题