编写我自己的C ++编译器..卡在变量上

时间:2012-10-21 14:07:16

标签: c++ variables assembly compiler-construction cpu

我目前正在使用JS中的Logisim CPU的c ++编译器,现在变量存在问题:

我在ram中定义了一个空间来存储数据/值,我已经定义了一个空间来存储数据空间的地址。我有一个带有指向最后一个变量的寄存器nx,以及一个带有指向最后一个“数据存储”RAM的指针的寄存器mx。但我不知道如何访问它们,例如这里:

修改后的C ++代码:

int *pointer_test;
int test;
test = 123;
pointer_test = &test;
*pointer_test = 25;

预汇编程序:

//Allocate new variable       <---  int *pointer_test;
add nx, 1
//Set the pointer pointing to zero
sram nx, 0


//Allocate another variable   <---  int test;
add nx, 1
//Allocate new storage for the variable
add mx, 1

//Let the variable point to the data <--- test = 123;
sram nx, mx
sram mx, 123

我现在如何实施:

pointer_test = &test; 

我只有&amp; test的值,保存在nx中因为它是声明的最后一个变量,而不是变量/指针“pointer_test”的地址......

1 个答案:

答案 0 :(得分:4)

您可能希望编写基于堆栈的程序集,就像过去20年中的其他C编译器一样。这意味着RAM中有一个称为堆栈的数据区域,它是一个FIFO队列,它会逐渐减少。堆栈也总是涉及至少一个寄存器:堆栈指针。堆栈指针指向堆栈中的当前位置,下一步将进行。因此,要向堆栈添加内容,将其放在堆栈指针指向的位置,然后从堆栈指针中减去该内容的大小。

来自C的程序集中最常用的另一个寄存器是基指针。基指针指向当前帧的开头。一个框架可以粗略地与C中的范围进行比较。所以,如果我有这个代码:

int a;
{
  int b;
}

顶部的堆栈位于0x9999,然后a将位于0x9995(假设4字节为int),堆栈指针现在指向0x9991,基本指针仍然位于0x9999。输入新范围时,基指针移动到堆栈指针,然后B放在0x9991。然后,当退出作用域时,堆栈指针被设置为基指针,有效地擦除较低范围内的变量。

我从未听说过您正在编程的架构,但只知道任何两个寄存器都可以,但是某些架构(如x86)具有特定的寄存器(ebpesp在32位上,64位上为rebrsp

但是为了更多地回答这个问题,编译器的工作就是知道每个变量在堆栈中的偏移量,所以它可以做一些事情,比如(伪代码):

base_pointer - 5 (Offset for pointer_test) = base_pointer - 4 (offset for test)