本文已参与「新人创作礼」活动,一起开启掘金创作之路。
第七章 指令系统
机器指令
人们习惯把每一条机器语言的语句称为机器指令,而又将全部机器指令的集合称为机器的指令系统。
指令的一般格式
1、指令的基本格式
计算机是通过执行指令来处理各种数据的.为了指出数据的来源,操作结果的去向及所执行的操作,一条指令必须包含下列信息:
(1)操作码,具体说明了操作的性质及功能.
(2)操作数的地址.
(3)操作结果的存储地址.
(4)下一条指令的地址.
从上述分析可知,一条指令实际上包括两种信息即操作码和地址码。
**操作码(operation code)**用来表示该指令所要完成的操作(如加,减,乘,除,数据传送等),其长度取决于指令系统中的指令条数.如操作码占7位,则该机器最多包含27=128条指令.
地址码用来描述该指令的操作对象,或直接给出操作数或指出操作数的存储器地址或寄存器地址(即寄存器名).
操作码的长度不固定会增加指令译码和分析难度,使控制器的设计复杂.
2、指令的执行过程 (1)读取指令
指令地址(在PC中)送到地址寄存器
读主存,读出内容(指令代码)送入指令寄存器IR
(2) 分析指令
形成下一条指令的地址并送到PC中
(3)执行指令
用一到几个执行步骤,完成指令的运算、操作功能,
不同的指令操作步骤和具体运算、操作功能各不相同
检查有无中断请求,无中断请求、进入下一条指令的执行过程
3、定长操作码指令格式 (1)零地址指令 格式: OP
OP——操作码
指令中只有操作码,而没有操作数或没有操作数地址,这种指令有两种可能:
1)无需任何操作数,如空操作指令,停机指令等.
2)所需的操作数是默认的.如堆栈结构计算机的运算指令,所需的操作数默认在堆栈中,由堆栈指针SP隐含指出,操作结果仍然放回堆栈中.又如Intel 8086的字符串处理指令,源,目的操作数分别默认在源变址寄存器SI和目的变址寄存器DI所指定的存储器单元中.
(2)一地址指令
格式: OP A
OP——操作码
A——操作数的存储器地址或寄存器名
指令中只给出一个地址,该地址既是操作数的地址,又是操作结果的存储地址.如加1,减1和移位等单操作数指令均采用这种格式,对这一地址所指定的操作数执行相应的操作后,产生的结果又存回该地址中.
在某些字长较短的微型机中(如早期的Z80,Intel8080,MC6800等),大多数算术逻辑指令也采用这种格式,第一个源操作数由地址码A给出,第二个源操作数在一个默认的寄存器中,运算结果仍送回到这个寄存器中,替换了原寄存器内容,通常把这个寄存器称累加器.
(3)二地址指令
格式:OP A1 A2
OP——操作码
A1——第一个源操作数的存储器地址或寄存器地址。
A2——第二个源操作数和存放操作结果的存储器地址或寄存器地址。
这是最常见的指令格式,两个地址指出两个源操作数地址,其中一个还是存放结果的目的地址.对两个源操作数进行操作码所规定的操作后,将结果存入目的地址,在本例中即为A2指定的地址
(4)三地址指令
格式: OP A1 A2 A3
OP——操作码
A1——第一个源操作数的存储器地址或寄存器地址
A2——第二个源操作数的存储器地址或寄存器地址
A3——操作结果的存储器地址或寄存器地址
其操作是对A1,A2指出的两个源操作数进行操作码(OP)所指定的操作,结果存入A3中.
(5)多地址指令
在某些性能较好的大,中型机甚至高档小型机中,往往设置一些功能很强的,用于处理成批数据的指令,如字符串处理指令,向量,矩阵运算指令等.
为了描述一批数据,指令中需要多个地址来指出数据存放的首地址,长度和下标等信息。
4、扩展操作码指令格式
设某机器的指令长度为16位,包括4位基本操作码字段和三个4位地址字段,其格式下:
OP(4) A1(4) A2(4) A3(4)
4位基本操作码有16个码点(即有16种组合),若全部用于表示三地址指令,则只有16条.但,若三地址指令仅需15条,两地址指令需15条,一地址指令需15条,零地址指令需16条,共61条指令,应如何安排操作码?
显然,只有4位基本操作码是不够的,必须将操作码的长度向地址码字段扩展才行.
一种可供扩展的方法和步骤如下:
(1)15条三地址指令的操作码由4位基本操作码从0000~1110给出,剩下一个码点1111用于把操作码扩展到A1,即4位扩展到8位;
(2)15条二地址指令的操作码由8位操作码从11110000~11111110给出,剩下一个码点11111111用于把操作码扩展到A2,即从8位扩展到12位;
(3)15条一地址指令的操作码由12位操作码从111111110000~111111111110给出,剩下的一个码点111111111111用于把操作码扩展到A3,即从12位扩展到16位;
(4)16条零地址指令的操作码由16位操作码从1111111111110000~1111111111111111给出.
指令字长取决于操作码的长度、操作数地址的长度和操作数地址的个数.为了提高指令的运行速度和节省存储空间,通常尽可能的吧常用的指令(如数据传输指令、算逻运算指令等)设计成单字长或短字长格式的指令。
操作类型
一、指令操作类型 1、数据传送
数据传送包括寄存器与寄存器,寄存器与存储单元,存储单元与存储单元之间的传送
2、算术逻辑操作
这操作可实现算术运算(加,减,乘,除,增1,减1,取负即求补)逻辑运算(与,或,非,异或)
3、移位
移位可分为算术移位,逻辑移位和循环移位三种
4、转移
(1)无条件转移
不受任何约束条件直接把程序转移到下一条需执行指令的地址
(2)条件转移
根据当前指令的执行结果决定是否需要转移
(3)调用与返回
子程序可在多处被调用
子程序调用可出现在子程序中,即允许子程序嵌套
每个CALL指令都对应一条RETURN指令
CPU必须记住返回地址,使子程序能准确返回,返回地址存放在以下3处
寄存器内:机器内设有专用寄存器,专用于存放返回地址
子程序的入口地址内:
栈顶内:现代计算机都设有堆栈,执行RETURN指令后,便可自动从堆栈内取出应返回的地址。
(4)陷阱(Trap)与陷阱指令
其实是一种意外事故的中断,一般不提供给用户使用,作为隐指令,再出现故障时,由CPU自动产生并执行。
5、输入输出
对于I/O单独编址的计算机而言,通常设有输入输出指令,他完成从外设中的寄存器读入一个数据到CPU寄存器内,或将数据从CPU的寄存器输出至某外设的寄存器中
6、其它
包括等待指令、停机指令、空操作指令、开中断指令、关中断指令、置条件码指令等
寻址方式
寻址方式是指确定本条指令的数据地址以及下一条将要执行的指令地址的方法,它与硬件结构紧密相关,而且直接影响指令格式和指令功能。 寻址方式分为指令寻址和数据寻址两大类。
一、指令寻址
1、 指令寻址 指令寻址分为顺序寻址和跳跃寻址两种.
顺序寻址可以通过程序计数器PC加1自动形成下一条指令的地址。 跳跃寻址则通过转移类指令实现,是通过对PC的运算得到新的下一条指令的地址。
二、数据寻址
1、数据寻址的概念 数据寻址的方式种类较多,在指令字中必须设一字段来指明属于哪一种寻址方式。指令的地址码字段通常都不代表操作数的真实地址,把它称为形式地址,记作A。操作数的真实地址称为有效地址,记作EA,它是由寻址方式和形式地址共同来确定的。 2、寻址方式: (1)立即寻址
所需的操作数由指令的地址码部分直接给出,就称为立即数(或直接数)寻址方式.这种方式的特点是取指时,操作码和一个操作数同时被取出,不必再次访问存储器,提高了指令的执行速度.但是由于这一操作数是指令的一部分,不能修改,而一般情况下,指令所处理的数据都是在不断变化的(如上条指令的执行结果作为下条指令的操作数),故这种方式只能适用于操作数固定的情况.通常用于给某一寄存器或存储器单元赋初值或提供一个常数等.(图中“#”表示立即寻址的标记,A的位数限制了这类指令所能表述的立即数的范围)
(2)直接寻址
指令的地址码部分给出操作数在存储器中的地址.
(3)隐含寻址
操作数的地址隐含在操作码或者某个寄存器中.
(4)间接寻址
在寻址时,有时根据指令的地址码所取出的内容既不是操作数,也不是下一条要执行的指令,而是操作数的地址或指令的地址,这种方式称为间接寻址或间址.
(5)寄存器寻址
计算机的中央处理器一般设置有一定数量的通用寄存器,用以存放操作数,操作数的地址或中间结果.假如指令地址码部分给出某一通用寄存器地址,而且所需的操作数就在这一寄存器中,则称为寄存器寻址.通用寄存器的数量一般在几个至几十个之间,比存储单元少很多,因此地址码短,而且从寄存器中存取数据比从存储器中存取快得多,所以这种方式可以缩短指令长度,节省存储空间,提高指令的执行速度,在计算机中得到广泛应用.
(6)寄存器间接寻址 EA = ( Ri)有效地址在寄存器中
寄存器中给出的是操作数的地址,因此还需要访问一次存储器才能得到操作数.
(7)基址寻址
在计算机中设置一个专用的基址寄存器,或由指令指定一个通用寄存器为基址寄存器.操作数的地址由基址寄存器的内容和指令的地址码A相加得到
(8)变址寻址
指令地址码部分给出的地址A和指定的变址寄存器X的内容通过加法器相加,所得的和作为地址从存储器中读出所需的操作数.这是几乎所有计算机都采用的一种寻址方式.
(9)相对寻址
把程序计数器PC的内容(即当前执行指令的地址)与指令的地址码部分给出的位移量(disp)之和作为操作数的地址或转移地址,称为相对寻址.
主要用于转移指令,执行本条指令后,将转移到(PC)+disp,(PC)为程序计数器的内容.相对寻址有两个特点:
1〉转移地址不是固定的,它随着PC值的变化而变化,并且总是与PC相差一个固定值disp,因此无论程序装人存储器的任何地方,均能正确运行,对浮动程序很适用.
2〉位移量可正,可负,通常用补码表示.如果位移量为n位,则这种方式的寻址范围在
(PC)-2n-1 ~(PC)+2n-1-1之间
计算机的程序和数据一般是分开存放的,程序区在程序执行过程中不允许修改.在程序与数据分区存放的情况下,不用相对寻址方式来确定操作数地址.
(10)堆栈寻址
在一般计算机中,堆栈主要用来暂存中断和子程序调用时现场数据及返回地址,用于访问堆栈的指令只有压入(即进栈)和弹出(即退栈)两种,它们实际上是一种特殊的数据传送指令:
压入指令(PUSH)是把指定的操作数送入堆栈的栈顶;
弹出指令(POP)的操作刚好相反,是把栈顶的数据取出,送到指令所指定的目的地.
一般的计算机中,堆栈从高地址向低地址扩展,即栈底的地址总是大于或等于栈顶的地址(也有少数计算机刚好相反)当执行压入操作时,首先把堆栈指针(SP)减量(减量的多少取决于压入数据的字节数,若压入一个字节,则减1;若压入两个字节,则减2,以此类推),然后把数据送人SP所指定的单元;当执行弹出操作时,首先把sp所指定的单元(即栈顶)的数据取出,然后根据数据的大小(即所占的字节数)对SP增量.
三、设计指令格式应考虑的各种因素
指令系统集中反映了机器的性能,又是程序员编程的依据,高档机必须能兼容低档机的程序运行,称之为“向上兼容”.
指令格式集中体现了指令系统的功能.为此,在确定指令系统时,必须从以下几个方面综合考虑.
① 操作类型:包括指令数及操作的难易程度
② 数据类型:确定哪些数据类型可以参加操作
③ 指令格式:包括指令字长、操作码位数、地址码位数、地址个数、寻址方式类型、以及指令字长和操作码位数是否可变等.
④ 寻址方式:包括指令和操作数具体有哪些寻址方式.
⑤ 寄存器个数:寄存器的多少直接影响指令的执行时间.
四、CISC和RISC的基本概念 1.CISC(复杂指令集计算机)
随着VLSI技术的发展,计算机的硬件成本不断下降,软件成本不断提高,使得人们热衷于在指令系统中增加更多的指令和复杂的指令,来提高操作系统的效率,并尽量缩短指令系统与高级语言的语义差别,以便于高级语言的编译和降低软件成本.
另外,为了做到程序兼容,同一系列计算机的新机器和高档机的指令系统只能扩充而不能减去任意一条,因此,促使指令系统越来越复杂,某些计算机的指令多达几百条.例如,DEC公司的VAX 11/780计算机有303条指令,18种寻址方式,我们称这些计算机为复杂指令系统计算机(complex instruction set computer,简称CISC).Intel公司的180X86微处理器,IBM公司的大,中计算机均为CISC.
2.RISC(简单指令集计算机)
1975年IBM公司开始研究指令的合理性问题,IBM的John cocke 提出了RISC的想法. 对CISC的测试表明: 最长使用的是一些简单指令,占指令总数的20%,但在程序中出现的频率却占80%. 而占20%的复杂指令,为实现其功能而设计的微程序代码却占总代码的80%.CISC研制时间长,成本高,难于实现流水线;因此出现了RISC技术。