内存与寄存器的比较
了解计算机中内存和寄存器的结构。
理想化计算机中的内存与寄存器
计算机内存由一系列内存单元组成,每个单元都有一个唯一的地址(位置)。每个单元中存储一个数值。我们称某个单元的内容为一个数字,尽管其内容可能并非实际的数值,而是程序的指令或数据。
由于内存访问速度慢于算术指令,CPU 中包含寄存器,用于加速需要临时存储结果的复杂操作。我们也可以将寄存器看作独立的内存单元。寄存器的名称即为其地址。
ARM64位计算机中的内存与寄存器
下图中,内存位置的地址包含整数值,通常相差 4 或 8,我们还展示了两个寄存器 x0 和 x1。这两个寄存器的低半部分分别称为 w0 和 w1。
由于内存单元存储的是数值,我们从简单的算术运算开始,让处理器计算两个数的和,以观察内存和寄存器值的变化。
在上述图示中,我们使用十进制地址来展示理想化计算机与ARM64位计算机之间的区别。通常情况下,我们使用十六进制地址来表示内存地址。
算术示例:内存布局与寄存器
在本例中,我们有两个内存地址(位置),分别命名为 a 和 b。我们可以将 a 和 b 看作对应地址(位置)的名称。现在引入一种特殊记法:[a] 表示“地址 a 处的内存内容”。如果用 C/C++ 语言编写此示例,我们声明并定义内存位置 a 和 b 如下:
1static int a, b;
默认情况下,程序加载时,静态内存位置会被初始化为零。程序加载后的初始内存布局如下所示:
算术示例:计算机程序
我们可以将计算机程序理解为一系列对内存单元和寄存器内容进行操作的指令。例如,在加法操作中,我们将内存单元 的内容与内存单元 的内容相加。在伪代码中,可以表示为:
1[14] <- [14] + [12]
我们第一个伪代码程序如表格左侧所示:
在伪代码中,我们使用以下约定符号:
<—表示将新值移动(赋值)到某个内存位置(地址)的内容。//是注释符号,其后整行均为注释。=表示某内存位置(地址)当前的值。
高级编程语言编写的代码通过编译器转换为机器语言。然而,若将机器语言的数字代码以某种助记符系统表示,则可读性更高,这种形式称为 汇编语言:
ARM64 中的自增 1 操作
1 ADD x1, x1, #1
上述语法将寄存器 x1 中存储的值增加 1。