1

你好,我正在读一本关于 ARM 架构的书。(我是菜鸟)我正在阅读有关 cpu 的寄存器文件的信息。

当我在 C++ 中创建一个变量时,这是通过总线 RM 发送到寄存器文件然后发送到 cpu 中的 ALU 的数据吗?示例:(int a = 1 + 1;)

地址寄存器是通过地址总线给我返回内存地址的吗?(例如:&a)

这本书没有提到c ++,但我只是想知道。

我只是想看看我是否理解这一点。感谢您的任何回答。

4

4 回答 4

3

尝试将 C++ 直接与寄存器文件或地址总线等硬件相关联可能不是一个好主意。将汇编语言作为中间级别插入更有意义。所以想想你的 C++ 是如何被翻译成汇编代码的,然后是汇编代码是如何控制硬件的。您的 ARM 书籍将教您组装和硬件之间的联系。要了解 C++ 和汇编之间的关系,最好查看一些编译器输出。

您可以使用编译器选项来检查 C++ 编译器的汇编输出。以 g++ 为例:

$ cat -n 测试.cc

 1  int a;
 2  
 3  void f() {
 4      a = a + 1;
 5  }

$ arm-elf-c++-4.6 -O2 -c -g -Wa,-ahl=test.s test.cc

$ 减 +/4:test.cc 测试.s

  [...]
   4:test.cc       ****         a = a + 1;
  16                            .loc 1 5 0
  17 0000 0C309FE5              ldr     r3, .L2
  18 0004 002093E5              ldr     r2, [r3, #0]
  19 0008 012082E2              add     r2, r2, #1
  20 000c 002083E5              str     r2, [r3, #0]
  [...]

您可以看到a (称为.L2) 的地址在第 17 行被移动到寄存器r3中,然后在第 18 行中,a从内存中检索并在第 19 行中递增,最后在第 20 行中再次存储到主内存中。

于 2012-07-13T20:54:11.997 回答
1

编译器可以通过将变量的内容放入寄存器来优化您的代码(因为寄存器比 RAM 快),但通常变量存储在 RAM 中的堆栈上,并&variable给出 RAM 中变量的(虚拟)地址。(您提到的“地址寄存器”与此无关——给出“处理器寄存器的地址”没有意义,只有 RAM 字节有地址。)

于 2012-07-13T18:36:03.363 回答
1

int a = 1 + 1;只会a用 2 加载变量。但实际上,变量的地址是内存中的真实地址,所以地址是进入地址总线的。

a我必须补充一点,如果在全球范围内声明就是这种情况。由于局部变量将存在于堆栈中,并且地址将是临时堆栈位置。

于 2012-07-13T18:36:28.970 回答
1

为了处理数据,必须首先将数据加载到寄存器中。当您进行算术运算时,您将值加载到寄存器中,并且一条指令使 cpu 将某些操作应用于一个或多个寄存器。算术寄存器通常将 2 个寄存器作为输入,并将值存储在第三个寄存器中。CPU 通过执行计算来编组 ALU。该值可能会立即存储回内存,但可能不会,由编译器自行决定。addressof 操作主要由编译器处理,因为它知道程序在内存中的布局,但程序不知道。

于 2012-07-13T18:39:37.063 回答