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

标签 c++ variables assembly compiler-construction cpu

我目前正在使用 JS 为我的 Logisim CPU 开发一个 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 中的范围进行比较。因此,如果我有以下代码:

int a;
{
  int b;
}

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

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

但为了更详细地回答这个问题,编译器的工作是了解每个变量在堆栈中的偏移量,因此它可以执行类似(伪代码)的操作:

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

关于c++ - 编写我自己的 C++ 编译器 .. 卡在变量上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12998551/

相关文章:

c++ - 扑克代码清理修改从书...不太正确

assembly - 如何在没有操作系统的情况下运行程序?

c++ - 初始化非默认可构造元素的 std::array?

c++ - 无法使用 Fedora 中的 g++

c - 在循环中创建的变量在 C 中的迭代期间更改值

bash - 在 YAD 中使用变量

php - mysql 从 $_POST 数组更新多行

c - 反编译汇编代码(真的)有多难?

CPU TSC fetch 操作,尤其是在多核多处理器环境中

c++ - 从客户端程序嗅探 HTTPS 流量