《计算机组成与设计:软硬件接口》笔记
记录一下关于学习计算机组成与设计的记录…
参考书籍:《计算机组成与设计硬件/软件接口》
计算机硬件的操作数
与高级语言程序不同,MIPS算术运算指令的操作数是很严格的,它们必须来自寄存器。寄存器由硬件直接构建且数量有限,是计算机硬件设计的基本元素。
可以把寄存器想象成构造计算机”建筑“的”砖块“, 在MIPS体系结构中寄存器大小为32位,32位为一组的情况经常出现,因此在MIPS体系结构中将其称为字 (word)。
字:计算机中的基本访问单位,通常是 32 位为一组
高级语言的变量与寄存器的一个主要区别在千寄存器的数量有限,寄存器个数限制为32个的理由可以表示为硬件设计三条基本原则中的第二条 : 设计原则2: 越小越快,而大量的寄存器可能会使时钟周期变长,因为电信号传输更远的距离必然花费更长的时间 。
尽管可以简单使用序号0 - 31表示相应的寄存器,但MIPS约定书写指令时用 一个 $
符后面跟两个字符来代表一个寄存器。
现在,我们使用$s0
,$s1
来表示与 C 和 Java程序中的变量所对应的寄存器,用$t0
, $t1
…来表示将程序编译为MlPS指令时所需的临时寄存器。
例如:
f = (g + h) - (i + j)
变量f、g、h、i和 j 依次分配给寄存器$s0
、$s1
、$s2
、$s3
和 $s4
。编译后的MIPS代码是什么?
除了将变量用上述寄存器代替,将两个临时变量用$t0
和 $t1
代替
add $t0, $s1, $s2 # g + h
add $t1, $s3, $s4 # i + j
sub $t0, $t0, $t1 # (g + h) - (i + j)
存储器操作数
处理器只能将少量数据保存在寄存器中,但存储器有数十亿的数据元素。因此,数据结构(如数组和结构)是存放在存储器中的
如上所述,MIPS 的算术运算指令只对寄存器进行操作,因此,MIPS 必须包含在存储器和寄存器之间传送数据的指令。这些指令叫作数据传送指令(data transfer instruction)。为了访问存储器中的一个字,指令必须给出存储器地址(ad-dress)。存储器就是一个很大的下标从0开始的一维数组,地址就相当于数组的下标。例如,在图2-2中,第三个数据元素的地址为2,存放的数据为10
数据传送指令:在存储器和寄存器之间移动数据的命令。
地址:用于在存储器空间中指明某特定数据元素位置的值
将数据从存储器复制到寄存器的数据传送指令通常叫取数(load)指令。取数指令的格式是操作码后接着目标寄存器,再后面是用来访问存储器的常数和寄存器。常数和第二个寄存器中的值相加即得存储器地址。实际的MIPS 取数指令助记符为Iw,为load word的缩写
与取数指令相对应的指令通常叫作存数(store)指令;它将数据从寄存器复制到存储器。存数指令的格式和取数指令相似:首先是操作码,接着是包含待存储数据的寄存器,然后是数组元素的偏量,最后是基址寄存器。同样,MIPS地址由常数和基址寄存器内容共同决定。实际的MIPS 存数指令为 sw,即 store word 的缩写
因为MIPS是按字节编址的,所以字的起始地址必 须是4的倍数。这叫对齐限制 (alignment restriction) , 许多体系结构都有这样的限制
例如:
假设变量h存放在寄存器$s2
中,数组A的基址放在$s3
中。试编译下面的C赋值语句:
A[12] = h + A[8]
lw $t0, 32($s3) # A[8]
add $t0, $s2, $t0 # h + A[8]
sw $t0, 48($s3) # Stores h + A[8] back into A[12]
为了得到正确的字节地址,与基址寄 存器$s3
相加的偏移量必须是 4 x 8, 即 32, 这样才能正确读到 A [8]
数据传送指令中的常量(本例中为8和12) 称为偏移量 (offset) , 存放基址的寄存器(本例中为$s3
) 称为基址寄存器 (base register)
许多程序的变量个数要远多于计算机的寄存器个数。因此,编译器会尽量将最常用的变量保持在寄存器中,而将其他的变量放在存储器中,方法是使用取数/存数指令在寄存器和存储器之间传送变量。将不常使用的变量(或稍后才使用的变量)存回到存储器中的过程叫作寄存器溢出
寄存器与存储器相比,访问时间短、吞吐率高,寄存器中的数据访问速度快并易于利用,访问寄存器相对于访问存储器功耗更小。因此,为了获得高性能和节约功耗,指令集的体系结构必须拥有足够的寄存器,并且编译器必须高效率地利用这些寄存器。
《计算机组成与设计:软硬件接口》笔记
https://poluk2001.github.io/2024/02/share-computer-foundation.html