一、 前言:
要计算机服从指挥,就必须用计算机的语言
1. 指令:计算机语言中的基本单词称为指令。
2. 指令集: 一个给定的计算机体系结构所包含的指令集合。
3. 尽管机器语言种类繁多,但彼此之间十分类似,因此其差异性更像人类语言中的“方言”,而并非独立语言,因此,了解其中一种机器语言之后,对其他机器语言即可触类旁通。
4. 常见的计算机指令集:MIPS、ARMv7,Intel x86等。下文以MIPS进行讲解。
5. 由于指令集的相似性,可以使得所有计算机都是基于基本原理相似的硬件技术构建,而另一方面,所有计算机都必须提供一些基本操作,此外,计算机设计者有一个共同目标:
找到一种语言,可方便硬件和编译器的设计,且使得性能最佳,同时使成本和功耗最低。
上图可以看出,不同指令集之间的相似性导致了硬件技术的相似性,而同时无论什么样的指令,都必须为计算机提供完备的基本操作,因此抽象出了设备简单性原则,依据此原则对计算机硬件进行设计。
二、计算机硬件操作
1. 前言:
任何计算机都必须能够执行算术运算,因此,针对计算机硬件的操作,如何设计硬件变得尤为重要。
2. 硬件设计三原则:
2.1 简单源于规整:这条原则针对指令格式进行严格约束,它规定,一条指令有且仅有三个操作数。
例如:add a,b,c(此处add为加和操作,a,b,c表示将b+c的结果存入a中,后续参数的表示会进一步规整化,因为参数一般都是存于寄存器中。)
2.2 越小越快:这条设计原则针对寄存器的个数进行约束,目的是为了保证程序的执行速度。寄存器数量过多会使得时钟周期变长。
概念解释:
操作数:与高级程序设计语言不通(如C语言),MIPS算术运算指令的操作数是很严格的,它必须来自于寄存器。
寄存器:寄存器由硬件直接构建且数量有限,是计算机硬件设计的基本元素。通俗来说,就相当于一个大小为32位的收纳盒,每个收纳盒只能存放一个操作数,这些收纳盒会直接参与到算术运算中去。比如,2.1中的add a,b,c这条指令中的三个参数,均需要从寄存器中选取。另外,MIPS体系结构中,有32个32位的寄存器,且寄存器位于处理器内部。
字:计算机中的基本访问单位,通常为32位为一组,在MIPS体系结构中与寄存器大小相同。
MIPS约定,书写指令时用一个“$”后面跟两个字符表示一个寄存器,如$S0,$S1,$t1。
PS:MIPS的算术运算指令只对寄存器进行操作,而实际上大量的数据会存储在存储器上,所以MIPS必须包含在存储器和寄存器之间传送数据的指令。这些指令叫做数据传送指令。
存储器:一个很大的下标从0开始的一维数组,因此,为了访问存储器中的一个字,指令必须给出存储器地址,这个地址就相当于数组下标。
上图中,可以看到,存储器通过数据通路,将数据传输至处理器的寄存器中,并进行相关的算术运算。
程序中,经常会在某个操作中使用常数,由于这些常数一般需要从存储器中读取,这一操作非常耗时,因此诞生了一种常数操作数的快速操作指令,叫做立即数。
2.3 优秀的设计需要适宜折中方案,通俗的来说,为了保持所有指令长度相同,又希望具有统一的指令格式,需要依据设计原则三,在保持所有指令长度相同的同时,不同指令类型采用不同的指令格式。
在解释第三条原则之前,需要讲解一下有符号数和无符号数
计算机硬件中,所有信息都是由二进制数位或者位组成。在一个32位的字中,从0开始,从右向左标记。最低有效位表示最右边的一位,最高有效位表示最左边的一位。
为了区分有符号数和无符号数,将最高有效位作为符号位进行区分。因此延伸出补码这一概念,补码和原码的关系:
x(原码) = x(补码)+1
注意,这里加1 是因为 补码最小位(1000 0000 0000 0000 0000 0000 0000 0000 )
和原码最大位(0111 1111 1111 1111 1111 1111 1111 1111)之和
为 -1,因此需要加1。
人操作计算机的方式和计算机看到的指令的方式是不同的。指令在计算机内部是以若干或高或低的电信号的序列表示的,并且在形式上和数的表示相同。实际上,指令的各部分都可以看成一个独立的数,将这些数拼接在一起就形成了指令。
因为几乎所有的质量都用到了寄存器,因此需要有一套规定,以将寄存器名字映射成数字,在MIPS汇编语言中,寄存器$S0~$S7映射到寄存器16~23,同时,寄存器$t0~$t7映射到寄存器8~15。
汇编语言指令需要翻译成机器指令。机器指令分为若干个字段。指令的布局形式叫做指令格式,把指令的数字形式称为机器语言,这样的指令序列叫做机器码。
MIPS字段(R型,用于寄存器):
op(6位):指令的基本操作,称为操作码
rs(5位):第一个源操作数寄存器
rt(5位):第二个源操作数寄存器
rd(5位):用于存放操作结果的目的寄存器
shamt(5位):位移量,作位移指令时才需要
funct(6位):功能,一般称为功能码,用于指明op字段操作的特定变式。
MIPS字段(I型,用于立即数):
op(6位):指令的基本操作,称为操作码
rs(5位):第一个源操作数寄存器
rt(5位):第二个源操作数寄存器
constant or address(16位):立即数地址