计算机语言中的基本单词称为指令,一台计算机的全部指令称为该计算机的指令集。学习的原则是:学习一种机器语言,其他的机器语言是相似的,原因是计算机的建立是建立在相似基本原理的硬件技术之上,另一方面因为有一些基本操作是所有计算机必须提供的。对于设计者,有如下原则遵循,不同原则有不同的背景:
设计原则一:简单源于规整
例一:
c语言中:f = (g+h) - (i + j);
c的编译器产生的MIPS代码如下:
add t0, g, h # temporary variable t0 contains g + h
add t1, i, j # temporary variable t1 contains i + j
add f, t0, t1 #f get t0 -t1, which is (g+h) - (i + j)
设计原则二:越少越快
寄存器数量多,非常容易导致时钟周期变长,因为大量寄存器之间通信需要更远的电信号传输距离;但是在某种程度上来说,不见得31个寄存器比32个要快,设计者的重要工作就是使得寄存器的的数量和时钟周期在最大化二者的基础上做到均衡。MIPS在约定书写时,用“$”+字符代表一个寄存器。MIPS只对寄存器中的数字进行计算,寄存器是有限的,因此MIPS必须包含在存储器和寄存器之间传送数据的指令,称之为数据传送指令。
例二:
g = h + A[8]; //A代表基址保存在$s3寄存器中,8代表偏移量
lw $t0, 8($s3) # temporary reg $t0 gets A[8]
add g, h, $t0 #g = h + A[8]
关于字节的几点说明:一个字的地址必和它所包括的四个字节中的某个的地址相匹配,且连续字的地址相差4。
常数或立即数操作数
设计原则三:越快越好
实际上,在运行SPEC2006测试基准程序集是,有超过一半的MIPS算术运算指令会用到常数作为操作数。如果将常用的数据放在专用的寄存器内,将会降低功耗和提高执行速度
避免使用取指令的一种解决方案是:一共一个操作数是常数的运算指令。addi: addi $s3, $s3, 4。另外地,常数0有作用,可以简化指令集,数据传送指令正好可以被视作一个操作数为0的加法,因此MIPS将寄存器$zero的值恒置为0。
设计原则四:优秀的设计需要适宜的折中方案
指令在计算机内部是以若干或高或低的电信号的序列表示的,并且看上去和数的表示是一样的。实际上,指令的各部分都可以看成一个独立的数,将这些数拼接在一起就形成了指令。因为所有的指令都要用到寄存器。所以必须有一套规定,以使寄存器名字映射成数字,例如:$s0--$s7映射到寄存器16~23, $t0--$t7映射到寄存器8~15.
例三:将add $t0, $s1, $s2 表示为MIPS汇编语言
为了方便起见,用10进制表达
0 17 18 8 0 32
说明:机器指令分为若干个字段,本例中的第一个和最后一个字段组合表达了加法的含义, 如前面所论述的17代表$s1、18代表$s2,8代表$t0,这样就将add $t0, $s1, $s2用数字表达
转换为二进制 000000 10001 10010 01000 00000 10000 这就是传说中的机器语言,第1、6字段决定了操作为add, 第2, 3段分别为$s1、$s2,第4个段为$t0。
如上所示,上述的指令以一定的格式写出,这种制定格式的计算机指令叫做:指令格式
MIPS字段 :op rs rt rd shamt func
op:指令的基本操作,称为操作码 6
rs:第一个源操作数寄存器 5
rt:第二个源操作数寄存器 5
rd:用于存放操作结果的目的寄存器 5
shamt:位移 5
funct:功能称为功能码,指明操作码的特定变式 6
弊端:如果地址使用其中的一个5位字段,那么取字指令就会被限制在很小的范围内,这时候就要用到第四个设计原则:保持所有的指令长度相同,但不同类型的指令采取不同的指令格式。
最常见的为R(register)型: 如上。 还有一种为I型:为立即数和数据传送指令使用,具体字段分配如下:
op:指令的基本操作,称为操作码 6
rs:第一个源操作数寄存器 5
rt:第二个源操作数寄存器 5
constance or adress 16
例四:分析 lw $t0, 32($s3) #temporary reg $t0 gets A[8] (注意:对于这条指令 rt字段表示接受取数结果的目的寄存器,为$t0)
rs为19, rt为8 constance 为 4*8=32
解决指令格式的方案:
指令 格式 op rs rt shamt funct adress
add R 0 reg reg 0 32 ##
sub R 0 reg reg 0 34 ##
addi I 8 reg reg ## ## constance
lw I 35 reg reg ## ## adress
sw I 43 reg reg ## ## adress
每种格式在第一个字段op战友不同的值区间,这样计算机就会知道是I型还是R型。
构建计算机的两个重要准则:
1.指令用数的形式表示
2.和书一样,程序在存储器中,并且可以读写。
这两个原则引出程序存储的概念,只要将程序和数据加载到存储器中并且告诉计算机在给定的存储器地址开始执行程序即可,将指令和数据以相同的方式进行处理,极大地简化了计算机系统的存储器硬件和软件。