计算机原理 - 第二章 指令系统
指令系统
2.1 概述
机器指令是计算机设计者赋予计算机实现某种基本操作的命令。
指令系统是指令的集合,包含一台计算机的所有机器指令。它处在软件和硬件的交界面上,能同时被硬件设计者和系统程序员看到。
复杂指令集计算机CISC 的主要特点是:
(1) 指令系统复杂:指令多/寻址方式多/指令格式多
(2) 指令周期长:绝大多数指令需要多个时钟周期才能完成
(3) 各种指令都能访问存储器:除专门的存储器读写指令外,运算指令也能访问存储器
(4) 采用微程序控制
(5) 有专用寄存器
(6) 难以进行编译优化生成高效目标代码
但是日趋庞大的指令系统不但使计算机的研制周期变长,而且难以保证设计的正确性,难以调试和维护,并且因指令操作复杂而增加时钟周期,从而降低了系统性能。
精简指令集计算机RISC 的主要特点是:
(1) 简化的指令系统:指令少/寻址方式少/指令格式少/指令长度一致
(2) 以RR方式工作:除Load/Store指令可访存外,其余指令都只访问寄存器
(3) 指令周期短:以流水线方式工作, 因而除Load/Store指令外,其他简单指令都只需一个或一个不到的时钟周期就可完成
(4) 采用大量通用寄存器,以减少访存次数
(5) 采用组合逻辑电路控制,不用或少用微程序控制
(6) 采用优化的编译器,力求有效地支持高级语言程序
——不必全部记住达到能默写的程度,从原理上理解并能说出区别就好。
2.2 指令格式
指令是软件要求计算机执行的一个命令,由操作码和操作数组成。
如,MIPS的R类指令格式为:
操作码
操作码的编码方式分为 Fixed Length Opcodes (定长操作码法) 和 Expanding Opcodes (扩展操作码法)。
定长编码:指令的操作码部分采用固定长度的编码,操作数为2的指数次。译码简单,但有信息冗余。
扩展编码:将操作码的编码长度分成几种固定长度的格式,操作码的位数随地址数的减少而增加,已被大多数指令集采用。使用频度高的指令分配短的操作码,使用频度低的指令分配较长的操作码。优点是缩短指令长度、减少程序总位数、增加指令字所能表示的操作信息。
——可能会有计算题要求算出某地址指令最多有几条,按照例题的方法来算即可。
地址码
地址个数越少,指令的功能就越简单,CPU的复杂性就越低,指令的长度也越短。地址个数越少,程序员完成同一功能的程序所用指令条数就越多,增加程序复杂度和执行时间。
地址的选择依赖于指令系统的结构:
堆栈结构:零地址指令
累加器结构:一地址指令
通用寄存器结构:二、三地址指令
一条指令包含1个操作码和多个地址码。
零地址指令:
(1) 无需操作数。如:空操作/停机等。
(2) 所需操作数为默认的。如:堆栈等。
一地址指令:其地址既是源操作数地址,也是存放结果地址。
(1) 单目运算:如:取反/取负等。
(2) 双目运算:另一操作数为默认的。如:累加器等。
二地址指令(最常用):分别存放双目运算中两个源操作数地址,并将其中一个地址作为存放结果地址。
三地址指令(RISC风格):分别为双目运算中两个源操作数地址和一个结果地址。
多地址指令:用于成批数据处理的指令。如:向量指令 等。
2.3 寻址方式
寻址技术(Addressing):确定操作数地址的技术。
寻址技术出现的目的是扩大访存范围,提高访问数据的灵活性和有效性,支持软件技术的发展:多道程序设计。
形式地址:指令中地址字段给出的逻辑地址。
有效地址:根据指令的寻址方式计算得到的操作数地址。
基本寻址方式有立即 / 直接 / 间接 / 寄存器 / 寄存器间接 / 偏移等。
(1) 立即数寻址: 操作数=A,指令执行速度快,但是操作数幅值有限,广泛使用。
指令地址字段直接给出操作数本身,立即寻址只能作为双操作数指令的源操作数。
(2) 存储器直接寻址: EA=A,有效地址计算简单,但是地址范围有限,较少使用。
操作数在存储器中,指令地址字段直接给出操作数所在存储器中的地址。
(3) 寄存器直接寻址: 操作数=(R),指令执行快,指令短,但是地址范围有限,广泛使用。
操作数在寄存器中,指令地址字段给出存放操作数的寄存器编码。
(4) 存储器间接寻址: EA=(A),有效地址范围大,但是多次存储器访问。
操作数在存储器中,指令地址字段给出的存储地址的单元内容是操作数在存储器中的地址。
(5) 寄存器间接寻址: EA=(R),地址范围大,但是会有额外存储器访问,广泛使用。
操作数在存储器中,指令地址字段给出的寄存器的内容是操作数在存储器中的地址。
(6) 偏移寻址: EA = (R) + A,灵活,但是复杂。组合了直接寻址和寄存器间接寻址两种方式。
相对寻址: EA=A+(PC),访问的是相对于当前指令处位移量为A的内存单元,实现公共子程序的浮动和相对转移。
子程序内地址关系相对独立,与用户程序的地址无关,不管浮动到哪里,总能实现AX与BX的内容相加。
基址寻址: EA=A+(B), 访问的是相对于基地址(B)处位移量为A的内存单元,实现程序重定位。
假定程序的第一条指令是要调用绝对地址为50的一个过程。若这个程序被调入分区1(地址1000),则指令跳转的目标地址是绝对地址50,而真正需要调用的地址是1050。若这个程序被调入分区2(地址2000),那么该程序就会去调用2050。
变址寻址: EA=A+(I),访问的是相对于形式地址A处位移量为(I)的内存单元,实现线性表元素的存取。
指令地址字段A给出数组基址,变址寄存器I每次自动加/减数组元素的长度X。
(7) 堆栈寻址: EA=栈顶,指令短,但是应用有限。
主要有两种操作,PUSH ( 从寄存器到堆栈)、POP (从堆栈到寄存器)。
其中出栈操作:POP Rn :SP ← (SP) + 2, Rn ← ((SP))
基址寻址、变址寻址的比较:
1、对于一道程序,基址是不变的,程序中的所有地址都是相对于基址变化;而对于变址寻址,形式地址给出的是一个存储器的地址基准,变址寄存器X存放的是相对于该基准地址的偏移量;
2、在基址寻址中,偏移量位数较短;而在变址寻址中,偏移量位数足以表示整个存储空间;
3、基址寻址立足于面向系统,主要是解决程序逻辑空间与存储器物理空间的无关性;而变址寻址立足于用户,主要是为编写高效的访问一片存储空间的程序。
复合寻址方式是把间接寻址方式和相对寻址方式或变址寻址方式相结合而形成,分为先间接或后间接两种方式。
变址间接式: EA =((X)+ A)
间接变址式: EA =(X)+ (A)
相对间接式: EA =((PC)+ A)
间接相对式: EA =(PC)+ (A)
2.4 计算机中的数据表示
数据表示
计算机内部所有信息都采用二进制编码表示,因为:
1、制造二个稳定态的物理器件比较容易
2、二进制的编码、计数、运算规则简单
3、与逻辑命题对应,便于逻辑运算,并能方便地用逻辑电路实现算术运算
机器数:用0和1编码的计算机内部 0/1 序列。
真值:机器数真正的值,即:现实中带正负号的数。
位:计算机处理、存储、传输信息的最小单位。
字节:计算机中信息的存储容量的计量单位。
字:表示被处理信息的单位,用来度量数据类型的宽度。
字长:即机器字长,等于CPU内部总线的宽度或运算器的位数或通用寄存器的宽度等。
——重要概念辨析!
模是指一个计量器的容量,记作M。对于二进制计数器,计数器为2位时,最多计:2^2=4个数(00~11),其模M=2^2;计数器为n位时,其模M=2^n。
余是指一个整体进行取模操作后的剩余部分,记作mod M。
正负:所有数前面设置符号位: ‘1’表示负数,‘0’表示正数。第一位不具备数值的性质。而0的补码表示是统一的,而原码和反码中均存在正0和负0,机器中最常用的是补码。
小数点有固定的位置:小数点左边的二进制数是整数,小数点右边的是小数——定点数。计算机通常将数分成定点整数和定点小数。
整数:小数点固定在最低位右边的数,整数的表示范围为:0 ≤ |x| ≤ 2^(n-1)
小数:小数点固定在数值部分的最高位左边的数,在1与0.5之间,小数的表示范围为:0 ≤ |x| ≤ 1-2^(-n)
规格化形式:小数点前只有一位非0数,同一个数只有一种规格化表示形式。只要对尾数和阶码分别编码,就可表示一个浮点数(即实数)。
规格化的目的是在浮点数总位数不变的情况下,为提高运算精度,使尾数(f)的有效数字尽可能占满f的有效空间。
1、右规: |f| ≥ 2,右移1位,阶码加1
2、左规: |f|<1,左移1位,阶码减1
浮点数精度由尾数 f 的位数决定,浮点数的表示范围由基数R和阶码e的位数决定,基数越大表示浮点数范围越大,但精度降低。
Sign bit:1 表示negative ; 0表示 positive
Exponent(阶码 / 指数):单精度规格化数阶码范围为0000 0001(-126) ~ 1111 1110(127),偏置值是127 (single),1023(double)。
Significand(尾数):规格化尾数最高位总是1,所以隐含表示,省1位。
为什么要用移码来表示阶码呢?便于浮点数加减运算时,需要进行对阶(对齐小数点)操作。
IEEE754的特殊表示:
十进制数的二进制编码表示主要有ASCII码和BCD码 、pentium十进制整数类型。
ASCII码:
1、前分隔数字串,符号位单独用一个字节表示,位于数字串之前
2、后嵌入数字串,符号位嵌入到最低位数字的ASCII码的高4位。正数不变;负数高4位变为0111。
BCD码:每个十进制数位至少用4位二进制位来表示。而4位二进制位可以组合成16种状态,去掉前10种状态后还有6种冗余状态。每个十进制数位的4个二进制数位(称为基2码)都有一个确定的权。
汉字是象形文字,一个字就是一方块图形。数量巨大,总数超过6万字,给汉字在计算机内部的表示、汉字的传输与交换、汉字的输入和输出等带来了一系列问题。用字模点阵码或字形码来显示或打印。
图像用像素来表示:
像素(pixel):构成图像的最小单位,即屏幕上的小圆点
颜色(color):任何颜色都可由红、绿和蓝三色调配而成
像素的颜色:用3个字节的二进制数表示。
存储二进制信息时的度量单位要比字节或字大得多。
“千字节”(KB),1KB=210字节=1024B
“兆字节”(MB),1MB=220字节=1024KB
“千兆字节”(GB),1GB=230字节=1024MB
“兆兆字节”(TB),1TB=240字节=1024GB
描述计算机通信带宽时,也会遇到上述信息单位,但其值大小与上述给的值不同,此时的值为:
“千字节”(KB),1KB=103字节=1000B
“兆字节”(MB),1MB=106字节=1000KB
“千兆字节”(GB),1GB=109字节=1000MB
“兆兆字节”(TB),1TB=1012字节=1000GB
注:溢出和进/借位标志的区别:
进/借位表示无符号数的运算结果是否超出范围,即使超出范围,如果保存进位或借位,运算结果仍然是正确的。
溢出标志表示有符号数的运算结果是否超出范围,若超出范围,则运算结果不正确。
处理器根据算术运算结果设置CF与OF标志:
设置CF标志时,运算结果被视为无符号数。
设置OF标志时,运算结果被视为有符号数。
数据存储
计算机编址方式主要有按字编制和按字节编址两种。现在的计算机大多采用字节编址。
大端方式(Big Endian):MSB所在的地址是数的地址。
即按照人眼习惯正常存储,高字节存储在低地址。
小端方式(Little Endian):LSB所在的地址是数的地址。
即按照人眼习惯反向存储,高字节存储在高地址。
数据对齐主要有按边界对齐和不按边界对齐两种。现在的计算机大多采用按边界对齐。
按边界对齐:假定字的宽度为32位,存储器按字节编址。那么字地址是4的倍数(低两位为0),半字地址是2的倍数(低位为0),字节地址任意。
2.5 程序的机器级表示
MIPS指令格式分为三种,所有指令都是32位宽,按字地址对齐。
R-Type:
I-Type:
J-Type:
OP:操作码。
rs:第一个源操作数寄存器。
rt:第二个源操作数寄存器。
rd:结果寄存器。
shamt:移位指令的位移量。
func:R-Type指令的OP字段特定为“000000”,具体操作由func字段给定。如:func=“100000” 表示“加法”运算。
immediate:立即数或load/store指令或分支指令的偏移地址。
target address:无条件转移地址低26位。将PC高4位拼上26位直接地址,最后添2个“0”就是32位目标地址。
关于MIPS指令的详细信息将在CPU章节进行整理。
注:MIPS指令使用的频率百分比:
算术运算指令对应于赋值语句操作;
处理数组或结构时,需要数据传送指令;
条件分支指令用于if-else语句、循环语句;
无条件转移指令用于过程调用及返回、case/switch语句。
参考教材:
《Computer Organization and Design—The Hardware/ Software Interface》 (Fifth Edition) ,2014
《计算机组成原理与设计》机械工业出版社,2005