你好,我正在读一本关于 ARM 架构的书。(我是菜鸟)我正在阅读有关 cpu 的寄存器文件的信息。
当我在 C++ 中创建一个变量时,这是通过总线 RM 发送到寄存器文件然后发送到 cpu 中的 ALU 的数据吗?示例:(int a = 1 + 1;)
地址寄存器是通过地址总线给我返回内存地址的吗?(例如:&a)
这本书没有提到c ++,但我只是想知道。
我只是想看看我是否理解这一点。感谢您的任何回答。
你好,我正在读一本关于 ARM 架构的书。(我是菜鸟)我正在阅读有关 cpu 的寄存器文件的信息。
当我在 C++ 中创建一个变量时,这是通过总线 RM 发送到寄存器文件然后发送到 cpu 中的 ALU 的数据吗?示例:(int a = 1 + 1;)
地址寄存器是通过地址总线给我返回内存地址的吗?(例如:&a)
这本书没有提到c ++,但我只是想知道。
我只是想看看我是否理解这一点。感谢您的任何回答。
尝试将 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 行中再次存储到主内存中。
编译器可以通过将变量的内容放入寄存器来优化您的代码(因为寄存器比 RAM 快),但通常变量存储在 RAM 中的堆栈上,并&variable
给出 RAM 中变量的(虚拟)地址。(您提到的“地址寄存器”与此无关——给出“处理器寄存器的地址”没有意义,只有 RAM 字节有地址。)
int a = 1 + 1;
只会a
用 2 加载变量。但实际上,变量的地址是内存中的真实地址,所以地址是进入地址总线的。
a
我必须补充一点,如果在全球范围内声明就是这种情况。由于局部变量将存在于堆栈中,并且地址将是临时堆栈位置。
为了处理数据,必须首先将数据加载到寄存器中。当您进行算术运算时,您将值加载到寄存器中,并且一条指令使 cpu 将某些操作应用于一个或多个寄存器。算术寄存器通常将 2 个寄存器作为输入,并将值存储在第三个寄存器中。CPU 通过执行计算来编组 ALU。该值可能会立即存储回内存,但可能不会,由编译器自行决定。addressof 操作主要由编译器处理,因为它知道程序在内存中的布局,但程序不知道。