手臂组装和C++

Arm Assembly & C++

本文关键字:C++      更新时间:2023-10-16

你好,我正在读一本关于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操作主要由编译器处理,因为它知道程序在内存中的布局,但程序不知道。

相关文章:
  • 没有找到相关文章