指令格式
指令(又称机器指令)是指示计算机执行某种操作的指令,是计算机运行的最小功能单位。一台计算机的所有指令的集合构成该机的指令系统,也称指令集。指令系统是计算机的主要属性,位于硬件和软件的交界面上。
通常,把指令长度等于机器字长的指令称为单字长指令,指令长度等于半个机器字长的指令称为半字长指令,指令长度等于两个机器字长的指令称为双字长指令。
根据指令中操作数地址码的数目不同,可将指令分成以下几种模式。
1.零地址指令
OP |
只给出操作码 OP,没有显示地址。这种指令有两种可能:
(1)不需要操作数的指令,如空操作指令、停机指令、关中断指令等。
(2)零地址的运算类指令仅用在堆栈计算机中。通常参与的两个操作数隐含地从栈顶和次栈顶弹出,送到运算器进行运算,运算结果再隐含地压入堆栈。
2.一地址指令
OP | A1 |
这种指令也有两种常见的形态,要根据操作码的含义确定它究竟是哪一种。
(1)只有目的操作数的单操作数指令,按 A1 地址读取操作数,进行 OP 操作后,结果存回原地址。如操作码的含义是加 1、减 1、求反、取补等。
(2)隐含约定目的地址的双操作数指令,按指令地址 A1 可读取源操作数,指令可隐含约定另一个操作数由 ACC (累加器)提供,运算结果也将存放在 ACC 中。
3.二地址指令
OP | A1 | A2 |
目的操作数和源操作数地址,其中目的操作数地址还用于保存本次的运算结果。
4.三地址指令
OP | A1 | A2 | A3(结果) |
若地址字段均为主存地址,则完成一条三地址需要 4 次访问存储器(取指令1次,取两个操作数2次,存放结果1次)
5.四地址指令
OP | A1 | A2 | A3(结果) | A4(下址) |
扩展操作码指令格式
图中所示三地址指令为15条,1111留作扩展操作码之用;二地址指令为15条,1111 1111留作扩展操作码只用;一地址指令为15条,1111 1111 1111留作扩展操作码之用,零地址指令为16条。
在 CPU 执行指令的过程中,指令的地址由程序计数器(PC)输出。
程序控制类指令的功能是改变程序执行的顺序。
程序控制类指令主要包括无条件转移指令、有条件转移、子程序调用和返回指令、循环指令等。中断隐指令是由硬件实现。
特权指令是指仅用于操作系统或其他系统软件的指令。为确保系统与数据安全起见,这类指令不提供给用户使用。
在指令格式中,采用扩展操作码设计方案的目的是保持指令字长度不变而增加指令的数量。
指令寻址方式
指令中的地址码字段并不代表操作数的真实地址,这种地址称为形式地址(A)。形式地址结合寻址方式,可以计算出操作数在存储器中的真实地址,这种地址称为有效地址(EA)。
指令寻址方式有两种:一种是顺序寻址方式,另一种是跳跃寻址方式。
- 顺序寻址可通过程序计数器(PC)加1(1个指令字长),自动形成下一条指令的地址。
- 跳跃寻址通过转移类指令实现。跳跃是指下条指令的地址码不由程序计数器给出,而由本条指令给出下条指令地址的计算方式。是否跳跃可能受到状态寄存器和操作数的控制,而跳跃到的地址分为绝对地址(由标记符直接得到)和相对地址(相对于当前指令地址的偏移量),跳跃的结果是当前指令修改 PC 值,所以下一条指令仍然通过程序计数器(PC)给出。
数据寻址是指如何在指令中表示一个操作数的地址,如何用这种表示得到操作数或怎样计算出操作数的地址。
常见的数据寻址方式:
1.隐含寻址:这种类型的指令不明显地给出操作数的地址,而是在指令中隐含操作数的地址。
2.立即(数)寻址:这种类型的指令的地址字段指出的不是操作数的地址,而是操作数本身,又称立即数。
3.立即寻址:指令字中的形式地址 A 是操作数的真实地址 EA,即 EA = A。
4.间接寻址:指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数地址的地址(俄罗斯套娃)。
5.寄存器寻址:寄存器寻址是指在指令字中直接给出操作数所在的寄存器编号,即 EA = Ri ,其操作数在由 Ri 所指的寄存器内。
6.寄存器间接寻址:寄存器间接寻址是指在寄存器 Ri 中给出的不是一个操作数,而是操作数所在主存单元的地址,即 EA = (Ri)(套娃套娃)。
7.相对寻址:相对寻址是把程序计数器(PC)的内容加上指令格式中的形式地址 A 而形成操作数的有效地址,即 EA = (PC) + A,其中 A 是相对于当前指令地址的位移量,可正可负,补码表示。A 的位数决定操作数的寻址范围。对于转移指令 JMP A,当 CPU 从存储器中取 出一个字节时,会自动执行 (PC)+ 1 → PC。若转移指令为 X,且占 2B,在取出该指令后,PC 的值会增 2,即 (PC)= X + 2,这样在执行完该指令后,会自动跳转到 X + 2 + A 的地址继续执行。
8.基址寻址:基址寻址是指将 CPU 中基址寄存器(BR)的内容加上指令格式中的形式地址 A 而形成操作数的有效地址,即 EA = (BR)+ A。其中基址寄存器既可采用专用寄存器,又可采用通用寄存器。基址寄存器是面向操作系统的,其内容由操作系统 或管理程序确定,主要用于解决程序逻辑空间与存储器物理空间的无关性。
9.变址寻址:变址寻址是指有效地址 EA 等于指令字中的形式地址 A 与变址寄存器 IX 的内容之和,即 EA = (IX)+ A,其中 IX 为变址寄存器(专用),也可用通用寄存器作为变址寄存器。变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容 可由用户改变(作为偏移量),形式地址 A 不变(作为基地址)。变址寻址的优点是可扩大寻址范围(变址寄存器的位数大于形式地址 A 的位数)。
基址寻址面向系统,主要用于为多道程序或数据分配存储空间,故基址寄存器的内容通常是由操作系统或管理程序确定,在程序的执行过程中其值不可变,而指令字中的 A 是可变的;变址寻址立足于用户,主要用于处理数组问题,在变址寻址中,变址寄存器的内容由用户设定,在程序执行过程中其值可变,而指令字中的 A 是不可变的。
10.堆栈寻址:堆栈是存储器(或专用寄存器组)中一块特定的、按后进先出(LIFO)原则管理的存储区,该存储区中被读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)。堆栈可分为硬堆栈与软堆栈两种。 寄存器堆栈又称 硬堆栈,不适合做大容量的堆栈;而从主存划出一段区域来做堆栈是最合算且最常用的方法,这种堆栈称为软堆栈。 在采用堆栈结构的计算机系统中,大部分指令表面上都表现为无操作数指令的形式,因为操作数地址都隐含使用了 SP。
寻址方式 | 有效地址 | 访存次数 |
隐含寻址 | 程序指定 | 0 |
立即寻址 | A 即是操作数 | 0 |
直接寻址 | EA = A | 1 |
一次间接寻址 | EA = (A) | 2 |
寄存器寻址 | EA = Ri | 0 |
寄存器一次间接寻址 | EA = (Ri) | 1 |
相对寻址 | EA = (PC) + A | 1 |
基址寻址 | EA = (BR) + A | 1 |
变址寻址 | EA = (IX) + A | 1 |
指令系统采用不同寻址方法的目的是缩短指令字长,扩大寻址空间,提高编程的灵活性,但这也提高了指令译码的复杂度。程序控制是靠转移指令方式实现的。
为了缩短指令中的某个地址段的位数,有效的方法是采取寄存器寻址。寄存器寻址中,只需指定寄存器编号,故能有效地缩短地址码地位数。
简化地址结构地基本方法是尽量采用隐地址。
在多道程序设计中,最重要的寻址方式是相对寻址。在多道程序设计中,各个程序段可能要在内存中浮动,而相对寻址特别有利于程序浮动。
CISC 和 RISC 的基本指令
复杂指令计算机(CISC)的主要特点如下:
- 指令系统复杂庞大,指令数目一般为 200 条以上。
- 指令的长度不固定,指令格式多,寻址方式多。
- 可以访存的指令不受限制。
- 各种指令使用频度相差很大。
- 各种指令执行时间相差很大,大多数指令需多个时钟周期才能完成。
- 控制器大多数采用微程序控制。
- 难以用优化编译生成高效的目标代码程序。
精简指令系统计算机(RISC)的主要特点如下:
- 选取使用频率最高的一些简单指令,复杂指令的功能由简单指令的组合来实现。
- 指令长度固定,指令格式种类少,寻址方式种类少。
- 只有 Load/Store (取数/存数)指令访存,其余指令的操作都在寄存器之间进行。
- CPU 中通用寄存器的数量相当多。
- RISC 一定采用指令流水线技术,大部分指令在一个时钟周期内完成。
- 以硬布线控制为主,不用或少用微程序控制。
- 特别重视编译优化工作,以减少程序执行时间。
从指令系统兼容性看,CISC 大多能实现软件兼容,即高档机包含低档机的全部指令,并可加以扩充。但 RISC 简化了指令系统,指令条数少,格式也不同于老机器,因此大多数 RISC 机不能与老机器兼容。
对比项目\类别 | CISC | RISC |
指令系统 | 复杂,庞大 | 简单,精简 |
指令数目 | 一般大于 200 条 | 一般小于 100 条 |
指令字长 | 不固定 | 定长 |
可访存指令 | 不加限制 | 只有 Load/Store 指令 |
各种指令执行时间 | 相差较大 | 绝大多数在一个周期内完成 |
各种指令使用频度 | 相差较大 | 都比较常用 |
通用寄存器数量 | 较少 | 多 |
目标代码 | 难以用优化编译生成高效的目标代码程序 | 采用优化的程序编译,生成代码较为高效 |
控制方式 | 绝大多数为微程序控制 | 绝大多数为组合逻辑控制 |
指令流水线 | 可以通过一定方式实现 | 必须实现 |
以上内容均来自王道书籍及相关课程等