计算机的操作和控制是由计算机的指令完成的。在计算机中有两种信息流,一种是数据流,它是处理的对象;一种是控制流,由它来对控制对数据信息的处理。
一、指令系统的发展
计算机的程序是由一系列的指令组成的,指令就是要计算机执行某种操作的命令。
从计算机组成的层次结构来说,计算机的指令有微指令、机器指令和宏指令之分。
微指令:微程序级的命令,它属于硬件;
宏指令:由若干条机器指令组成的软件指令,它属于软件;
机器指令(指令):介于微指令与宏指令之间,每条指令可完成一个独立的算术运算或逻辑运算。是CPU唯一能接收的命令。
指令系统:一台计算机中所有机器指令的集合,它是表征一台计算机性能的重要因素,其格式与功能不仅直接影响到机器的硬件结构,也直接影响到系统软件,影响到机器的适用范围。
计算机指令系统的发展过程:
50年代:指令系统只有定点加减、逻辑运算、数据传送、转移等十几至几十条指令。
60年代后期:增加了乘除运算、浮点运算、十进制运算、字符串处理等指令,指令数目多达一二百条,寻址方式也趋多样化。
60年代后期开始出现系列计算机(指基本指令系统相同、基本体系结构相同的一系列计算机)一个系列往往有多种型号,它们在结构和性能上有所差异。同一系列的各机种有共同的指令级而且新推出的机种指令系统一定包含所有旧机种的全部指令,旧机种上运行的各种软件可以不加任何修改便可在新机种上运行,大大减少了软件开发费用。
70年代末期:大多数计算机的指令系统多达几百条。我们称这些计算机为复杂指令系统计算机(CISC)。
但是如此庞大的指令系统难以保证正确性,不易调试维护,造成硬件资源浪费。为此人们又提出了便于VLSI技术实现的精简指令系统计算机(RISC)。
二、对指令系统性能的要求
指令系统的性能决定了计算机的基本功能,它的设计直接关系到计算机的硬件结构和用户的需要。一个完善的指令系统应满足如下四方面的要求:
完备性:用汇编语言编写各种程序时,指令系统直接提供的指令足够使用,而不必用软件来实现。
完备性要求指令系统丰富、功能齐全、使用方便。
有效性:利用该指令系统所编写的程序能够高效率的运行。
高效率主要表现在程序占据存储空间小、执行速度快。一般来说,一个功能更强、更完善的指令系统,必定有更好的有效性。
规整性:规整性包括指令系统的对称性、匀齐性、指令格式和数据格式的一致性。
对称性:指在指令系统中所有的寄存器和存储器单元都可同等对待,所有的指令都可使用各种寻址方式;
匀齐性:是指一种操作性质的指令可以支持各种数据类型;
指令格式和数据格式的一致性:是指指令长度和数据长度有一定的关系,以方便处理和存取。
兼容性:系列机各机种之间具有相同的基本结构和共同的基本指令集,因而指令系统是兼容的,即各机种上基本软件可以通用。但由于不同机种推出的时间不同,在结构和性能上有差异,做到所有软件都完全兼容是不可能的,只能做到“向上兼容”,即低档机上运行的软件可以在高档机上运行。
三、低级语言与硬件结构的关系
计算机语言具有高级语言和低级语言之分。
高级语言如C,FORTRAN等,其语句和用法与具体机器的指令系统无关。
低级语言分机器语言(二进制语言)和汇编语言(符号语言),这两种语言都是面向机器的语言,和具体机器的指令系统密切相关。机器语言用指令代码编写程序,而符号语言用指令助记符来编写程序。
计算机能够直接识别和执行的唯一语言是二进制语言,但人们采用符号语言或高级语言编写程序。为此,必须借助汇编程序或编译程序,把符号语言或高级语言翻译成二进制码组成的机器语言。
汇编语言依赖于计算机的硬件结构和指令系统。不同的机器有不同的指令,所以用汇编语言编写的程序不能在其他类型的机器上运行。
第二节 指令格式
机器指令是用机器字表示的。
指令字(简称指令):表示一条指令的机器字。
指令格式则是指令字用二进制代码表示的结构形式,由操作码字段和地址码字段组成。
操作码字段表征指令的操作特性与功能;地址码字段通常指定参与操作的操作数的地址。
指令字的格式如下:
一、操作码
指令系统的每一条指令都有一个操作码,它表示该指令应进行什么性质的操作。
不同的指令用操作码字段的不同编码来表示,每一种编码代表一种指令。
组成操作码字段的位数一般取决于计算机指令系统的规模。指令系统包含的指令越多,其操作码的位数越多。
定长指令:指令系统的所有指令的操作码和地址码的长度固定不变。
变长指令:指令系统中不同指令可以有不同的长度,称为变长指令系统。
二、地址码
根据一条指令中有几个操作数地址,可将该指令称为几操作数指令或几地址指令。
一般的操作数有被操作数、操作数及操作结果这三种数,因而就形成了三地址指令格式。在此基础上,后来又发展成二地址格式、一地址格式和零地址格式
1>零地址指令
零地址指令的指令字中只有操作码,而没有地址码。
2>一地址指令
一地址指令常称为单操作数指令。通常这种指令以运算器中累加寄存器AC中的数据为被操作数,指令字的地址码字段所指明的数为操作数,操作结果又放回累加寄存器AC中。
(AC) OP (A) -> AC
其中OP表示操作性质;(AC)表示累加寄存器AC中的数;(A)表示内存中地址为A的存储单元中的数或运算器中地址为A的通用寄存器中的数;→表示把操作(运算)结果传送到指定的地方。
3>二地址指令
二地址指令常称为双操作数指令,它的两个地址码字段分别指明参与操作的两个数在内存中或运算器中通用寄存器的地址,A1作存放操作结果的地址。
(A1) OP (A2) -> A1
4>三地址指令
三地址指令字中有三个操作数地址。
(A1) OP (A2) -> A3
A1为被操作数地址,也称源操作数地址; A2为操作数地址,也称终点操作数地址; A3为存放结果的地址。同样,A1,A2,A3可以是内存中的单元地址,也可以是运算器中通用寄存器的地址。
二地址指令格式中,从操作数的物理位置来说,又可归结为三种类型:
存储器-存储器(SS)型指令:操作时都是涉及内存单元,参与操作的数都放在内存里,从内存某单元中取操作数,操作结果存放至内存另一单元中,因此机器执行这种指令需要多次访问内存。
寄存器-寄存器(RR)型指令:需要多个通用寄存器或个别专用寄存器,从寄存器中取操作数,把操作结果放到另一寄存器。机器执行寄存器-寄存器型指令的速度很快,因为执行这类指令,不需要访问内存。
寄存器-存储器(RS)型指令:执行此类指令时,既要访问内存单元,又要访问寄存器。
三、指令字长度
指令字长度:一个指令字中包含二进制代码的位数。
机器字长:计算机能直接处理的二进制数据的位数,它决定了计算机的运算精度。
单字长指令:指令字长等于机器字长度的指令。
半字长指令:指令字长等于半个机器字长度的指令。
双字长指令:指令字长等于两个机器字长度的指令。
多字长指令:指令字长等于几个机器字长度的指令。
使用多字长指令,目的在于提供足够的地址位来解决访问内存任何单元的寻址问题。其主要缺点是必须两次或多次访问内存才能取出一整条指令,降低了CPU的运算速度,又占用了更多的存储空间。
等长指令字结构:各种指令字长度是相等的。这种指令字结构简单,且指令字长度是不变的。
变长指令字结构:各种指令字长度随指令功能而异。结构灵活,能充分利用指令长度,但指令的控制较复杂。
四、指令助记符
由于硬件只能识别1和0,所以采用二进制操作码是必要的,但是我们用二进制来书写程序却非常麻烦。
为了便于书写和阅读程序,每条指令通常用3个或4个英文缩写字母来表示。这种缩写码叫做指令助记符。
由于指令助记符提示了每条指令的意义,因此比较容易记忆,书写起来比较方便,阅读程序容易理解。
在不同的计算机中,指令助记符的规定是不一样的。因此,指令助记符还必须转换成与它们相对应的二进制码。这种转换借助汇编程序可以自动完成。
五、指令格式举例
1、八位微型计算机的指令格式
8位微型机字长只有8位,指令结构通常采用可变字长形式,包含单字长、双字长、三字长指令等多种。
8位微机的内存按字节编址,所以单字长指令每执行一条指令后,指令地址加1。双字长指令或三字长指令每执行一条指令时,指令地址要加2或加3,可见多字长的指令格式不利于提高机器速度。
2、PDP/11系列机指令格式
PDP/11系列机指令字长16位,其指令格式如表4.3所示。
在PDP/11中,操作码字段是不固定的,其长度也是不相同的。这样做可以扩展操作码以包含较多的指令。但是操作码字段不固定,对控制器的设计来说必将复杂化。
3、pentium指令格式
pentium机的指令字长度是可变的:从1字节到12字节,还可以带前缀。
pentium机的非固定长度的指令格式是典型的CICS结构特征。一是为了与它的前身80486保持兼容,二是希望能给编译程序写作者以更多灵活的编程支持。
指令的前缀是可选项,其作用是对其后的指令本身进行显示约定。每个前缀占1个字节。
指令前缀:包括LOCK(锁定)前缀和重复前缀。LOCK前缀用于多CPU环境中对共享存储器的排他性访问。重复前缀用于字符串的重复操作,以获得比软件循环方法更快的速度。
段取代前缀:根据指令的定义和程序的上下文,一条指令所使用的段寄存器名称可以不出现在指令格式中,这称为段缺省规则。当要求一条指令不按缺省规则使用某个段寄存器时,必须以段取代前缀明确指明此段寄存器。
操作数长度取代前缀和地址长度取代前缀:在实地址模式下,操作数和地址的默认长度是16位;在保护模式下,若D=1,操作数和地址的默认长度是32位,若D=0,二者的默认长度是16位。
指令本身由操作码字段、Mod-R/M字段、SIB字段、位移量字段、立即数字段组成。除操作码字段外,其他四个字段都是可选字段。
Mod-R/M字段:规定了存储器操作数的寻址方式,给出了寄存器操作数的寄存器地址号。
SIB字段:和Mod-R/M字段一起,对操作数来源进行完整的说明 (其中S:比例系数,I:变址寄存器,B:基址寄存器号)。
第三节 操作数类型
一、一般的数据类型
计算机内部处理的数据类型通常分为四类:
地址型数据:数据地址
数值型数据:定点、浮点、十进制数等
字符型数据:字符串
逻辑型数据:位
二、Pentium数据类型
三、Power PC数据类型
第四节 指令和数据的寻址方式
计算机中的指令和数据都是存放在存储器中的,对指令和数据的访问都是通过存储单元的地址编码进行的。
寻址方式:计算机中形成指令或数据地址的方式称为寻址方式。
寻址方式分为两类,既指令寻址方式和数据寻址方式。
一、指令寻址方式
1、指令的顺序寻址
计算机中程序是由指令序列构成的,大多数指令是顺序存放在存储器中的。当执行一段程序时,通常是一条指令接一条指令的顺序执行。这种程序顺序执行的过程,我们称为指令的顺序寻址方式。
为实现指令的顺序寻址,计算机中使用程序计数器(又称指令指针寄存器)PC来计数指令的顺序号,并通过自动增量方式实现顺序寻址。
2、指令的跳跃寻址
当程序转移执行的顺序时,指令的寻址就采取跳跃寻址方式。
跳跃,是指下条指令的地址码不是由程序计数器给出,而是由本条指令给出。程序跳跃后,按新的指令地址开始顺序执行。
当程序中出现转移、子程序调用、子程序返回、中断等指令时,会产生跳跃。
跳跃是通过直接对程序计数器的内容进行设置而实现的。
二、操作数寻址方式
形成操作数的有效地址的方法,称为操作数的寻址方式。
通常,在指令中操作数地址由X,R,D等字段组成。X表示寻址方式、R表示使用的寄存器号、D为形式地址。
指令中操作数字段的地址码是由形式地址和寻址方式特征位等组合形成,因此,一般来说,指令中所给出的地址码,并不是操作数的有效地址。因此,寻址过程就是把操作数的形式地址,变换为操作数的有效地址的过程。
1. 隐含寻址
在指令中不明显的给出而是隐含着操作数的地址。
2. 立即寻址
指令的地址字段指出的不是操作数的地址,而是操作数本身。
3. 直接寻址
在指令格式的地址字段中直接指出操作数在内存的地址D。
4. 间接寻址
间接寻址的情况下,指令地址字段中的形式地址D不是操作数的真正地址,而是操作数地址的指示器,D单元的内容才是操作数的有效地址。
间接寻址分为寄存器间接寻址和存储器间接寻址。
5、寄存器寻址方式
当操作数不放在内存中,而是放在CPU的通用寄存器中时,可采用寄存器寻址方式。此时指令中给出的操作数地址不是内存的地址单元号,而是通用寄存器的编号。
6. 相对寻址方式
相对寻址是把程序计数器PC的内容加上指令格式中的形式地址D而形成操作数的有效地址。
其中形式地址D通常称为偏移量,其值可正可负,相对于当前指令地址进行浮动。
由于程序计数器的内容就是当前指令的地址。“相对”寻址,就是相对于当前的指令地址而言。
7. 基址寻址方式
基址寻址方式是将CPU中基址寄存器的内容加上指令格式中的形式地址而形成操作数的有效地址。
基址寄存器的位数可以设置得很长,从而可以在较大的存储空间中寻址。
8. 变址寻址方式
变址寻址方式把CPU中某个变址寄存器的内容与偏移量D相加来形成操作数有效地址。
9. 块寻址方式
块寻址方式经常用在输入输出指令中,以实现外存储器或外围设备同内存之间的数据块传送。块寻址方式在内存中还可用于数据块搬家。块寻址时,通常在指令中指出数据块的起始地址(首地址)和数据块的长度(字数或字节数)。
如果数据块是变长的,可用三种方法指出它的长度:
指令中划出字段指出长度;
指令格式中指出数据块的首地址与末地址;
由块结束字符指出数据块长度。
10. 段寻址方式
微型机中采用了段寻址方式,在寻址一个内存具体单元时,由一个基地址再加上某些寄存器提供的16位偏移量来形成实际的20位物理地址。这个基地址就是CPU中的段寄存器。
三、寻址方式举例
1、pentium的寻址方式
pentium的外部地址总线宽度是36位,但它也支持32位物理地址空间。
在实地址模式下,逻辑地址形式为段寻址方式:将段名所指定的段寄存器内容(16位)左移4位,低4位补全0,得到20位段基地址,再加上16位段内偏移,即得20位物理地址。
在保护模式下,32位段基地址加上段内偏移得到32位线性地址。由存储管理部件将其转换成32位的物理地址。
2、Power PC寻址方式
Power PC是RISC机器,它采用了一组相当简单的寻址方式。
第五节 典型指令
一、指令的分类
一个完善的指令系统应该包括:数据传送类指令、算术运算类指令、程序控制类指令、输入输出类指令、字符串类指令、系统控制类指令。
1、数据传送指令
数据传送指令主要包括取数指令、存数指令、传送指令、成组传送指令、字节交换指令、清累加器指令、堆栈操作指令等等。这类指令主要用来实现主存和寄存器之间,或寄存器和寄存器之间的数据传送。
2.算术运算指令
这类指令包括二进制定点加、减、乘、除指令,浮点加、减、乘、除指令,求反、求补指令,算术移位指令,算术比较指令,十进制加、减运算指令等。这类指令主要用于定点或浮点的算术运算,大型机中有向量运算指令,直接对整个向量或矩阵进行求和、求积运算。
3.逻辑运算指令
这类指令包括逻辑加、逻辑乘、按位加、逻辑移位等指令,主要用于无符号数的位操作、代码的转换、判断及运算。移位指令用来对寄存器的内容实现左移、右移或循环移位。
4.程序控制指令
程序控制指令也称转移指令。执行程序时,有时机器执行到某条指令时,出现了几种不同结果,这时机器必须执行一条转移指令,根据不同结果进行转移,从而改变程序原来执行的顺序。这种转移指令称为条件转移指令。除各种条件转移指令外,还有无条件转移指令、转子程序指令、返回主程序指令、中断返回指令等。转移指令的转移地址一般采用直接寻址和相对寻址方式来确定。
5.输入输出指令
输入输出指令主要用来启动外围设备,检查测试外围设备的工作状态,并实现外部设备和CPU之间,或外围设备与外围设备之间的信息传送。
6.字符串处理指令
字符串处理指令是一种非数值处理指令,一般包括字符串传送、字符串转换(把一种编码的字符串转换成另一种编码的字符串)、字符串替换(把某一字符串用另一字符串替换)等。这类指令在文字编辑中对大量字符串进行处理。
7.特权指令
特权指令是指具有特殊权限的指令。这类指令只用于操作系统或其他系统软件,一般不直接提供给用户使用。在多用户、多任务的计算机系统中特权指令必不可少。它主要用于系统资源的分配和管理。
8. 其他指令
除以上各类指令外,还有状态寄存器置位、复位指令、测试指令、暂停指令,空操作指令,以及其他一些系统控制用的特殊指令。
二、CISC和RISC
复杂指令系统计算机(CISC)的指令系统通常了二、三百条指令。为便于高级语言编程和复杂功能实现,在CISC的指令系统中通常还包含了一些功能非常复杂和强大的指令。
但是通过对复杂指令系统计算机(CISC)的测试表明,最常使用的一些最简单最基本的指令,只占指令总数的2%,并且这些指令在程序中出现的频率达到80%以上。
由于复杂指令实现使计算机硬件实现更加复杂,而使用的机会又很少,因此,人们提出了精简指令系统计算机(RISC)。
精简指令系统计算机(RISC)的最大特点是:
选取使用频率最高的一些简单指令,减少指令系统的指令条数。(简化,高效)
指令长度固定,指令格式种类少,寻址方式种类少。(简化指令分析)
只有取数/存数指令访问存储器。其余的指令的操作都在寄存器间进行。(提高处理效率)
使用很多内部寄存器。
Power PC机的指令系统及特点:
Power PC机的指令系统包含有64条指令,分为五种指令类型。采用定长指令系统,指令字长都是32位。指令格式规整。