编写我自己的C++编译器. 卡在变量上
Writing my own C++ Compiler .. stuck on variables
我目前正在为我的 Logisim CPU 在 JS 中开发一个 c++ 编译器,现在变量有问题:
我在 ram 中定义了一个空间来存储数据/值,并且我定义了一个空间来存储数据空间的地址。我有一个寄存器 nx,带有指向最后一个变量的指针,还有一个寄存器 mx,带有指向最后一个"数据存储"RAM 的指针。但是我不知道如何访问它们,例如在这里:
修改后的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;
我只有 &test 的值,保存在 nx 中,因为它是声明的最后一个变量,而不是变量/指针"pointer_test"的地址......
您可能希望编写基于堆栈的汇编,就像过去 20 年中所有其他 C 编译器一样。这意味着RAM中有一个称为堆栈的数据区域,它是一个FIFO队列,向下增长。堆栈也总是涉及至少一个寄存器:堆栈指针。堆栈指针指向堆栈中下一个操作将要去的当前位置。因此,要向堆栈添加某些内容,请将其放在堆栈指针指向的位置,然后从堆栈指针中减去该内容的大小。
另一个在程序集中最常用的来自 C 的寄存器是基指针。基指针指向当前帧的开头。在 C 中,帧可以粗略地与示波器进行比较。所以,如果我有这个代码:
int a;
{
int b;
}
顶部的堆栈位于0x9999,然后a
将位于0x9995(假设为 4 字节整数),堆栈指针现在指向 0x9991,而基本指针仍指向 0x9999。输入新作用域后,基指针移动到堆栈指针,然后将 B 放在0x9991处。然后,当范围退出时,堆栈指针设置为基指针,从而有效地擦除较低作用域中的变量。
我从未听说过您正在编程的架构,但只知道任何两个寄存器都可以,但是某些架构(如 x86)具有特定的 stak 寄存器(ebp
,esp
在 32 位上,reb
和rsp
在 64 位上)。
但是为了回答这个问题,编译器的工作是知道每个变量在堆栈中的偏移量是多少,因此它可以执行以下操作(伪代码):
base_pointer - 5 (Offset for pointer_test) = base_pointer - 4 (offset for test)
- CLANG 编译器 说:变量"PTR"可能未初始化
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- C++编译器是否优化了顺序静态变量读取?
- 有没有办法强制C++编译器将变量存储在寄存器中?
- 如果函数包含静态变量,为什么编译器不执行内联?
- 现代c++编译器会优化不可变的临时变量吗
- 是否允许编译器优化掉局部易失性变量
- 现代编译器会优化只引用对象子集的局部变量吗
- (C++)for循环中的空初始语句是否保存所有编译器中变量的上一次初始化
- 如何在编译器时动态获取元组内的变量类型C++?
- 奇怪的未声明变量编译器错误
- 是否可以将移动的变量标记为不再可用,并在使用它时收到编译器警告?
- 编译器是否足够聪明,以至于 std::move 变量超出范围?
- 编译器在传递 const 变量时返回错误:模板参数不是常量表达式
- 使用常量变量作为维度将矩阵声明为类成员时出现编译器错误
- Eclipse 编译器有没有办法将变量中的地址字段显示为整数值?
- 为什么编译器并不总是优化局部变量?
- 关于基类中的显式模板实例化和静态变量:编译器错误或规范的有效解释
- 无法引用专用静态成员变量:编译器错误