计算机组成与设计 - 存储器和寄存器

265 阅读4分钟

计算机硬件的操作

编译器将C语言转换成RISC-V汇编指令。

计算机硬件的操作数

算术指令的操作数会受到限制,它们必须取自寄存器,而寄存器数量有限并内建于硬件的特殊位置。

RISCV体系,寄存器大小为64位。还有一种是32位。 双字和字。

双字: 计算机中一种访问的基本单位。通常是64位一组。

字: 32位。

寄存器的数量有限,RISCV通常为32个。算术指令中,三个操作数必须从32个64位寄存器中选择。

设计原则 更少则更快

数量过多的寄存器可能会增加时钟周期,因为电信号传输的距离越远,所花费的时间就越长。

更少则更快的原则不是绝对的,31个寄存器也许并不比32个快。

寄存器编号由0-31来编写,约定在x后跟一个寄存器编号来表示。

存储器操作数

计算机如何表示和访问庞大的数据结构。

处理器只能在寄存器保存少量数据,数据结构可以保存在内存中。

RISCV算术指令只用于寄存器。 RISCV包含内存和寄存器之间传输的指令,这些指令为数据传输指令。要访问内存中的双字或字。 指令需提供内存地址。内存指示一个大型的一维数组,其地址作为数组的下标,从0开始时。第三个数据的地址为2.

RISCV采用字节寻址,每个双字表示8个字节。字表示4个字节,32位。地址是0. 8 16

将数据从内存复制到寄存器的数据传输通常称为载入指令load。载入指令的格式为操作名称后紧跟待取的寄存器,然后是寄存器和用于访问内存的常量。指令的常量部分和第二个寄存器中的内存相加组成内存地址。

ld 表示取双字。

g = h+A[8]

我们必须先将A[8]传送到一个寄存器,该数组元素的地址是数组A的基地址加上元素8的的和,数组应该存放在一个临时寄存器中以便于下一条指令使用。

ld x9,8(x22). x22寄存器中存储的是数组A的基地址,数组元素的地址是基地址加上元素序号8的地址。

下一条指令对x9操作,因为A[8]已存放在x9中,h存放在x21中,g存放在x20中。

add x20,x21,x9

存放基址寄存器x22被称为基址寄存器,而数据传输指令中的常数8被称为偏移量。

按单个字节进行寻址。双字的地址与双字内的八个字节之一的地址相匹配的。并且连续双字的地址相差8。

第三个双字的字节地址是16. 0 8 16 。 32位单字的处理器,第三个字的地址为8.

计算机分为两种,大端最左边的地址作为双字地址。 RISCV为小端字节的地址作为双字地址。 小端为最右边。

字节寻址会影响数组下标,加到基址寄存器x22的偏移量是8x8或64,以便于取地址选择A[8]。

在载入指令相反的指令通常被称为存储指令,它从寄存器复制到内存。存储指令的格式类似于载入指令的格式:

操作名称, 要写回内存的寄存器,然后是基址寄存器,最后是选择数组元素的偏移量。同样RISCV地址是由常数和基址寄存器内容共同决定的。 sd 存储双字。

在很多体系结构中,字起始地址必须是4的倍数。双字的起始地址必须是8的倍数。被要求称对齐限制。

由于加载和存储指令中的地址是二进制数。

A[12] = h + A[8]

ld x9 64(x22)

add x9 x21,x9

sd x9,96(x22)

最后的指令使用96(12x8)作为偏移量,寄存器x22作为基址寄存器,将总和存储到A[12] 中。

加载双字和存储双字是在RISCV体系结构中存储器和寄存器之间传输双字的指令。

将常用的变量放在寄存器,不常用的变量或稍后才用的变量放在内存中。使用load和store在寄存器和内存之间传输变量。 将不常用的变量存放在内存的过程称为寄存器换出。

内存一定比寄存器慢,因为寄存器更少。