手臂组装和C++
Arm Assembly & C++
你好,我正在读一本关于ARM体系结构的书。(我是个笨蛋)我在读关于cpu的寄存器文件。
当我在c++中创建一个变量时,这是通过总线RM&然后发送到cpu中的ALU?示例:(int a=1+1;)
地址寄存器是通过地址总线返回内存地址的吗?(例如:&a)
这本书没有提到c++,但我只是想知道。
我只是想看看我是否理解这一点。谢谢你的回答。
尝试将C++与寄存器文件或地址总线等硬件直接关联可能不是一个好主意。插入汇编语言作为中间级别更有意义。所以,想想C++是如何被翻译成汇编代码的,然后汇编代码是如何控制硬件的。你关于ARM的书将教你组装和硬件之间的联系。要理解C++和程序集之间的关系,最好查看一些编译器输出。
您可以使用编译器选项来检查C++编译器的程序集输出。例如使用g++:
$cat-n test.cc
1 int a;
2
3 void f() {
4 a = a + 1;
5 }
$arm-elf-c++-4.6-O2-c-g-Wa,-ahl=测试.cc
$less+/4:test.cc test.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;
将只加载带有2的变量a
。但事实上,变量的地址是内存中的真实地址,所以到达地址总线的地址也是如此。
我必须补充一点,如果a
是全局声明的,情况就是这样。由于局部变量将存在于堆栈中,并且地址将是临时堆栈位置。
为了处理数据,必须首先将数据加载到寄存器中。当你进行算术运算时,你将值加载到一个寄存器中,一条指令会使cpu对一个或多个寄存器应用一些运算。算术运算器通常采用2个寄存器作为输入,并将值存储在第三个寄存器中。CPU通过执行计算来封送ALU。此值可能会立即存储回内存,但编译器可能不会自行决定。addressof操作主要由编译器处理,因为它知道程序在内存中的布局,但程序不知道。
- 没有找到相关文章