计算机指令就是计算机硬件能够识别并直接执行的操作命令。指令系统是指一台计算机所能执行的全部的指令称为该机的指令系统。指令系统表明了计算机的硬件功能,从而决定如何使用计算机(编译软件),而CPU的基本任务是解释执行指令代码,这又决定了硬件逻辑设计,因此说指令系统是CPU硬件与软件的界面。 一、指令格式
计算机指令编码的格式称为指令格式。
指令格式指定指令中编码字段的个数、个字段的位数,以及各字段的编码方式,以便于指令进行译码。
指令由操作码(OP)和地址码(AD)两部分构成。操作码说明指令所要完成的操作,地址码说明指令操作对象(或者是操作数或者是操作数的地址)。通常,地址码很少直接给出操作数本身,多是指明操作数的来源,有的还要指明运算结果保存于何处,以及下一条指令从何处取等问题。在指令格式设计时应该考虑以下四点:
①指令长度:指令长多少位,是定长度还是变长度
②操作码:操作码结构需要多少位,位数固定还是可扩展,是一段操作码还是若干段组合
③地址结构:一条指令涉及到哪些地址,在指令中给出哪些地址,哪些地址隐含约定。
④寻址方式:如何获得操作数的地址,是直接、间接还是经过计算获得。 1.指令长度
字长:计算机能直接处理的二进制数据的位数。他是计算机的一个重要指标,字长决定着计算机的运算精度。
指令的长度是由操作码的长度与地址码的长度共同作用的,地址码的长度决定了指令的直接寻址能力。指令长度应该是字节的整数倍,指令长度有定长(如模型机)和不定长(PC机)之分。指令长度与机器字长没有固定关系,一般情况指令长度大于或等于字长。指令长度越长,指令所能表示的操作信息和地址信息就越多,指令的功能就越丰富。但是同时指令越长,指令所占存储空间越多,读指令的时间就越长,CPU的译码电路就越复杂。因此早期的计算机(如NOVA系列)采用的是16位定长指令格式。目前的RISC系统也建议尽可能的采用短指令长度。但在实际应用中我们发现,一个指令系统中的指令长度是很难固定的,因此现代计算机广泛采用变长度指令长度。如Inter系列,8088采用1-6个字节变长指令格式,它的第一个字节是操作码,第二个字节是寻址方式和寄存器号,其后两个字节是位移量或是立即数,或再跟两个字节的立即数。随着Inter系列的发展,指令长度越来越长,80486指令长度达到15个字节。由于指令的长度不同就会面临指令对齐的问题,比如一台32位机,保存三条指令其长度分别是4,6,4
- 1 -
① ① ① ① 如此存储时,对于③指令要两次取指令, ② ② ② ② 影响CPU的速度, ② ② ③ ③ ③ ③ 改为
① ① ① ① ② ② ② ② ② ② ③ ③ ③ ③ 同理,数据存储也有类似问题。
数据存储分为小数端存储和大数端存储两种。
小数端存储,低位在低地址,读得数据是1234H,
XXX0H 34H 如PC机。
XXX1H 12H 大数端存储,高位在低地址,读得数据是3412H
2.操作码
指令操作码的长度决定了指令系统中完成不同操作的指令条件。操作码分为定长和不定长两类。定长操作码的指令译码电路简单,所以受RISC所推崇,也被广泛应用。但是定长操作码不利于指令的升级兼容。例如,指令操作码长为6位共可有64条指令,如果第一代机有63条指令,第二代升级时只能加1条指令,那是不可接受的。而用变长就不受这个限制。 不定长操作码(扩展操作码):
例1.指令中的操作码个数不同,而又希望指令长度相同,则采用此法。某机器指令格式全长16位,操作码4位,
15 12 11 8 7 4 3 0 操作码 地址码1 地址码2 地址码3 现在打算在原有基础上修改指令系统使其有15条3地址指令,15条2地址指令,15条1地址指令,16条0地址指令,(现在有15条3地址指令,14条2地址指令,31条1地址指令,16条0地址指令。)能否分配,如何分配? 例:第一代机器60条指令(等长),第二代加32条指令(等长)如何分配? 第一代:000000——111011
第二代:111100000——111111111
在实际机器中,可采取不同的具体做法。例如PDP—11,指令字长16位,高4位做基本操作码,但是取其中的四种组合0000,0111,1000,1111作为扩展操作码标志,可将操作码分别扩展成7位,8位,10位,12位,13位,16位等多种情况,其中16位指令的操作码可达几百种。一般情况下,考虑到CPU电路的复杂度,变长指令一般长度为2种,至多3种,极少象PDP—11这样。
- 2 -
指令长短的分配原则的一个重要条件是指令使用概率,考虑到操作码压缩的问题,建议采用哈夫曼编码。
例:一台模型机有7条指令,其使用频度如下表 指令 使用频度(Pi) 哈夫曼编码 变形哈夫曼编码 I1 0.40 0 00 I2 0.30 10 01 I3 0.15 110 10 I4 0.05 11110 1100 I5 0.04 11111 1101 I6 0.03 11101 1110 I7 0.03 11100 1111 通过构造哈夫曼树知哈夫曼编码,编码平均长度为: 0.40*1+0.30*2+0.15*3+0.05*5+0.04*5+0.03*5+0.03*5=2.2 由于考虑到指令长度种类不易过多,多采用变形哈夫曼编码。 3.地址结构 ⑴四地址指令
操作码 操作数地址1 操作数地址2 结果存放地址 下条指令地址 ⑵三地址指令 操作码 操作数地址1 操作数地址2 结果存放地址 由于计算机中程序指令顺序存储,所以在计算机中设置指令计数器PC,每执行一条指令,PC+1,所以省去了“下条指令地址项” ⑶二地址指令 操作码 目的操作数地址 源操作数地址 采用二操作数形式,把最后计算得到的结果保存于目的操作数的地址中。对于PC机来说,目的操作数在前 ADD AX,BX;而对于PDP-11系列机来说,他们的目的操作数在后。 ⑷单地址指令 ① 操作码 目的操作数
此类单地址指令只有一个操作数,即目的操作数;如 INC,DEC,NOT,NEG ② 操作码 源操作数
此类单地址指令只有一个操作数,是源操作数;如 MUL,DIV;此类指令本应该是二操作数指令,但是由于某种设计原因,将其中的一个操作数隐含在操作码中(系统约定)。 ⑸零地址指令 操作码 ①隐含操作数:此类零地址指令有一个操作数,即目的操作数,但隐含了;如 PUSHF,POPF
- 3 -
②真正的无操作数指令,如HLT,NOP(空操作) 4.寻址方式
寻址方式指的是确定本条指令的数据地址及下一条要执行的指令地址的方法,所以寻址方式包括指令的寻址方式和操作数的寻址方式。指令的寻址方式有两种:顺序寻址和转移寻址。顺序寻址采用PC+1的形式取下一条指令,除了顺序寻址都属于转移寻址方式。
操作数的寻址方式有很多种,下面将介绍常用的几种寻址方式。
注意:操作数的寻址方式与操作数有关,理论上讲,操作数的寻址方式应该在地址码部分,但是实际情况是表示操作数的寻址方式的编码有的是在地址码部分如PDP-11系列机,也有的是在指令的操作码部分中表示操作数的寻址方式,如IBM370,他的寻址方式在指令的前两位。下面将举例说明操作数的寻址方式,此处为了方便起见,假设所有操作都是字节操作,目的操作数都在寄存器中。
操作数寻址方式:
⑴立即数寻址方式:指令中的操作对象是一个操作数 load R0, #05H ;将05H送入R0( R0 =05H)
add R0, #30H ;将30H与R0的内容相加,和送入R0( R0 =35H) ⑵寄存器寻址方式:指令中的操作对象是寄存器,操作数在寄存器中 load R2, R0 ;将R0的内容送入R2( R2 =35H)
add R2, R0 ;将R0的内容与R2的内容相加,和送入R2( R2 =6AH) ⑶直接寻址方式:指令中的操作对象是操作数的地址,操作数在存储器中 load R0, 05H ; R0 =12H
add R0, 30H ; R0 =78H 05H 12H ∶ 30H 66H
⑷寄存器间接寻址方式:指令中的操作对象是寄存器,寄存器的内容是操作数的地址
load R1, (R0); 假设R0=78H, R1 =10H 78H 10H add R1, (R0); R1 =20H
⑸间接寻址方式:指令中的操作对象是操作数的地址的地址 load R0, (05H) ; R0 =31H
add R0, (30H) ; R0 =79H 05H 12H ∶ 12H 31H ∶
30H 66H ∶ 66H 48H
- 4 -
⑹基址寻址方式:
机器设有一个基址寄存器Rb,指令中的操作对象一个地址,操作数的地址由基址寄存器的内容与指令中的位移量相加而成,设基址寄存器Rb=1000H load R0, 100H(Rb) ; R0 =20H
add R0, -200H(Rb) ; R0 =56H 0C00H 36H ∶ 1100H 20H
⑺变址寻址方式:
机器设有一个变址寄存器Rd,指令中的操作对象一个地址,操作数的地址由变址寄存器的内容与指令中的位移量相加而成,在执行操作后,变址寄存器将自动加1或减1。设变址寄存器Rd=500H,自增型寄存器。 load R0, -100H(Rd) ; R0 =60H,Rd =501H
add R0, 200H(Rd) ; R0 =93H,Rd =502H 400H 60H ∶ 700H 32H 33H 变址寻址方式利于数组操作。 ⑻相对寻址方式:
指令中的操作对象一个地址,操作数的地址由指令自己的地址与指令中的位移量相加而成。设本指令的地址为A00H。 load R0, -100H(PC) ; R0 =20H
add R0, 200H(PC) ; R0 =57H 900H 20H ∶ C00H 36H 37H
⑼页面寻址方式:
机器中的PC寄存器参与寻址,指令中的操作对象一个地址,操作数的地址由PC的高位与指令中的位移量拼接而成。设PC=1000H,取二进制高8位。 load R0, 200H,PC ; R0 =30H
100200H 30H
⑽堆栈寻址方式
堆栈是主存中一个连续的存储区域,对数据的存取按一种特定的顺序进行。堆栈只允许存储区的一端加入/移出数据。堆栈工作有两种方式:向上生成(栈底在高位地址)和向下生成(栈底在低位地址)。PC机的堆栈是向上生成的。 堆栈设有堆栈寄存器SP,SP作为堆栈指针,其初值是栈底,随着堆栈的工作SP进行加减变化。
- 5 -
例如:PC机的堆栈
入栈:PUSH (SP)← (SP)- 2
((SP)+1,(SP))← 数据
出栈:POP 数据← ((SP)+1,(SP)) (SP)← (SP)+ 2 ⑾块寻址方式:
块寻址方式在指令中指出数据块的首地址和数据块的长度。用于DMA工作方式。
例:已知某时刻机器中 R1=10H
⑴ load R0, R1 ; R0 = 10H 20H 10H ⑵ load R0, (R1); R0= 20H ⑶ load R0, 10H ; R0 = 20H 30H 20H ⑷ load R0, (10H) ; R0 = 30H ⑸ load R0, #10H ; R0 = 10H 40H 30H ⑹ 设此时基址寄存器Rb = 10H,变址寄存器(自增) load R0, 10H(Rb) ; R0 =30H Rb = 10H load R0, 10H(Rd) ; R0 =40H Rd = 21H ⑺ 设此指令的的地址为20H
load R0, -10H(PC) ; R0 =20H
二、指令类型
1.算术逻辑运算,如:add, sub, and, or, not 2.移位操作,如:shl, shr, sal, sar, rol, ror 3. 浮点数运算(要用到80387协处理器)
4.十进制运算指令,如:daa, das (BCD码调整) 5.字符串处理指令,如:cmps(串比较) 6.数据传送指令,如:mov 7.转移类指令
⑴无条件转移和条件转移
通常,计算机中有N, Z, V, C, P 五个标志位 N = 1 表示结果为负 Z = 1 表示结果为0
C = 1 表示结果有进位或是无符号数比较小于(有借位) V = 1 表示结果溢出
P = 1 表示结果有奇数个1
C+Z = 1 表示无符号数比较小于或等于 N⊕V = 1 表示有符号数比较小于
N⊕V+Z = 1 表示有符号数比较小于或等于
- 6 -
d = 20H R以下是用一个串加电路,表示如何得到N, Z, V, C, P 五个标志位
C = C4⊕C3⊕C0 Z = S4+S3+S2+S1+S0 N = S4
V = C4⊕C3
P = S4⊕S3⊕S2⊕S1⊕S0
⑵调用指令和返回指令,如:call, ret ⑶陷阱与陷阱指令,如:int
8. 堆栈及堆栈操作指令,如:push, pop 9. 输入输出指令,如:in, out 10.特权指令
11.其它指令:向量指令,多处理机指令,控制指令
三、复杂指令系统(CISC)与精简指令系统(RISC) 1.指令系统的性质 ⑴完备性
指令系统的完备性是指用汇编语言编制各种程序时,指令系统直接提供的指令足够使用,而不必用软件实现。(注:一台机器最基本也是必不可少的指令并不多,大多数指令可以用软件实现)例如,乘指令,可以用软件实现,但是指令系统中有乘法指令的系统就要比没有的更具有完备性。 ⑵有效性
指令系统的有效性是指利用该指令系统所编制的程序能够高效率的运行。高效率主要表现在占存储空间小,执行速度快两个方面。 ⑶规整性
指令系统的规整性包括指令系统的对称性,匀齐性和指令格式与数据格式的一致性。
指令的对称性是指在指令系统中所有的寄存器和存储单元都可以同等对待,所有的指令都可以使用各种寻址方式。他对简化汇编程序设计,提高程
- 7 -
序的可读性有利。
指令的匀齐性是指一种操作性质的指令可以支持各种数据类型,它可以使汇编语言程序设计与高级语言编译程序无需要考虑数据类型而选用指令,因而提高了编程效率。
指令格式与数据格式的一致性是指令长度与数据长度有一定关系,以方便存储和处理。指令长度是字节的整数倍,而数据长度一般为1、2、4、8个字节。 ⑷兼容性
指令的兼容性主要要求指令应该具有向上兼容,即低档次机器可以运行的程序在高档次机器上也可以运行。 2.复杂指令系统(CISC)
基于指令系统的上述四个性质,同时由于硬件成本下降,软件成本上升,所以在指令系统中增加更多指令来提高操作系统的效率,缩短指令系统与高级语言的语义差别,以便于高级语言的编译,从而降低软件成本。其缺点是:造成硬件过于复杂。
3.精简指令系统(RISC)
指令系统庞大了,但是统计表明,机器所执行的指令80%以上是简单指令,因此提出精简指令系统以求优化的思想。优化:提高机器性能,提高CPU速度。
一个程序的执行时间为P,高级语言编译后在机器上运行的指令数为I,执行每条指令所用的平均周期数为CPI,每个机器周期为T,则有
P = I * CPI * T,为了减小I、CPI、T 应采用以下七点。 ⑴选取使用频度高的简单指令,以及有用但不复杂的指令。
⑵指令长度固定,指令格式种类少,寻址方式种类少。从而缩短译码时间。 ⑶只有存取数指令访问存储器,其他指令在寄存器间进行(可以采用Cache)。读写存储器的时间比较长,只有必须时才读写存储器,以提高CPU效率。 ⑷CPU中通用寄存器的数量要多
⑸大部分指令在一个机器周期内完成。(采用流水线方式,注意相关与转移) ⑹以硬布线控制逻辑为主,少用或者不用微码控制。
⑺通过精简指令和优化设计编译程序,以简单有效的支持高级语言实现。
- 8 -
因篇幅问题不能全部显示,请点此查看更多更全内容