Contents

计算机组成(第四章)

指令系统

概 述

  1. 指令:是指示计算机某种操作的命令

    微指令,机器指令,宏指令

  2. 指令系统:一台计算机中所有机器指令的集合,它是表征一台计算机性能的重要因素

    它是机器硬件设计的依据,也是软件设计的基础

    它决定了一台计算机硬件的主要性能和基本功能。是硬件和软件间的界面。

  3. 系列计算机:有共同的指令集,相同的基本体系结构。

  4. 一个完善的指令系统应满足

    1. 完备性:指令丰富,功能齐全,使用方便。

    2. 有效性:程序占空间小,执行速度快

    3. 规整性:对称性,匀齐性,指令格式和数据格式的一致性

      对称性:指在指令系统中所有的寄存器和存储器单元都可同等对待,所有的指令都可使用各种寻址方式;

      匀齐性:是指一种操作性质的指令可以支持各种数据类型;

      指令格式和数据格式的一致性:是指指令长度和数据长度有一定的关系,以方便处理和存取

    4. 兼容性:“向上兼容”—-系列机中低档机上运行的软件可以在高档机上运行。

计算机语言与硬件结构的关系

  1. 高级语言的语句和用法与具体机器的指令系统无关
  2. 低级语言分机器语言和汇编语言,他们和具体机器的指令系统密切相关
  3. 汇编语言与硬件的关系密切,编写的程序紧凑、占内存小、速度快,特别适合与编写经常与硬件打交道的系统软件;而高级语言不涉及机器的硬件结构,通用性强、编写程序容易,特别适合与编写与硬件没有直接关系的应用软件

概 述

  1. 机器指令的要素

    1. 操作码
    2. 源操作数
    3. 目的操作数
    4. 下一条指令的引用

    指令字(简称指令)即表示一条指令的机器字。

    指令格式则是指令字用二进制代码表示的结构形式,由操作码字段和地址码字段组成

    https://cdn.jsdelivr.net/gh/adan-ning/images/202404232042031.png

操作码

设计计算机时,对指令系统的每一条指令都要规定一个操作码

指令操作码表示该指令进行什么性质的操作,表征指令的操作特性与功能

组成操作码字段的位数一般取决于计算机指令系统的规模。

例如,一个指令系统只有8条指令,则有3位操作码就够;如果有32条指令,那么就需要5位操作码

地址码

地址码字段通常指定参与操作的操作数的地址

根据一条指令中有几个操作数地址,可将该指令称为几操作数指令或几地址指令。目前,二地址指令和一地址指令用的最多

https://cdn.jsdelivr.net/gh/adan-ning/images/202404232045304.png

  1. 零地址指令的指令字中只有操作码,而没有地址码。

  2. 一地址指令常称为单操作数指令

    OP (A) -> A         (AC) OP (A) -> AC
    
  3. 二地址指令常称为双操作数指令。      

    (A1)  OP  (A2) -> A1
    
  4. 三地址指令字中有三个操作数地址。

    (A1)  OP  (A2) -> A3 
    
  5. OP表示操作性质;(AC)表示累加寄存器AC中的数;(A)表示内存中地址为A的存储单元中的数或运算器中地址为A的通用寄存器中的数;→表示把操作(运算)结果传送到指定的地方

  6. 二地址指令格式中,从操作数的物理位置来说,又可归结为三种类型

  7. 存储器-存储器(SS)型指令:操作时都是涉及内存单元,参与操作的数都放在内存里,从内存某单元中取操作数,操作结果存放至内存另一单元中,因此机器执行这种指令需要多次访问内存

  8. 寄存器-寄存器(RR)型指令:需要多个通用寄存器或个别专用寄存器,从寄存器中取操作数,把操作结果放到另一寄存器。机器执行寄存器-寄存器型指令的速度很快,因为执行这类指令,不需要访问内存

  9. 寄存器-存储器(RS)型指令:执行此类指令时,既要访问内存单元,又要访问寄存器

指令字长度

一个指令字中包含二进制代码的位数,称为指令字长度。而机器字长是指计算机能直接处理的二进制数据的位数,与主存单元的位数一致,它决定了计算机的运算精度

https://cdn.jsdelivr.net/gh/adan-ning/images/202404232052781.png

它们之间关系如上:其中L为指令字长度,N为机器字长度

  1. 使用多字长指令,目的在于提供足够的地址位来解决访问内存任何单元的寻址问题。其主要缺点是必须两次或多次访问内存以取出一整条指令,降低了CPU的运算速度,又占用了更多的存储空间
  2. **等长指令字结构:**各种指令字长度是相等的。这种指令字结构简单,且指令字长度是不变的。
  3. 变长指令字结构:各种指令字长度随指令功能而异。结构灵活,能充分利用指令长度,但指令的控制较复杂
指令助记符            
  1. 由于硬件只能识别1和0,所以采用二进制操作码是必要的,但是书写程序却非常麻烦
  2. 为了便于书写和阅读程序,每条指令通常用3个或4个英文缩写字母来表示。这种缩写码叫做指令助记符
  3. 在不同的计算机中,指令助记符的规定是不一样的。因此,指令助记符还必须转换成与它们相对应的二进制码
指令格式举例       

**八位微型计算机的指令格式 **

8位微型机字长只有8位,指令结构是一种可变字长形式,包含单字长、双字长、三字长指令等多种

https://cdn.jsdelivr.net/gh/adan-ning/images/202404232056504.png

内存按字节编址,所以单字长指令每执行一条指令后,指令地址加1

双字长指令或三字长指令每执行一条指令时,指令地址要加2或加3,可见多字长的指令格式不利于提高机器速度

指令和指令系统——指令的使用
  1. 一般的操作数类型大小选择主要有:字节、半字(16位)、单字(32位)、和双字(64位)

    https://cdn.jsdelivr.net/gh/adan-ning/images/202404232058923.png

    例:指令格式如下所示,其中机器字长16位,OP为操作码,试分析指令格式的特点。

    https://cdn.jsdelivr.net/gh/adan-ning/images/202404232058027.png

    例: 指令格式如下所示,机器字长16位,OP为操作码字段,试分析指令格式特点。

    https://cdn.jsdelivr.net/gh/adan-ning/images/202404232059475.png

指令和数据的寻址方式
  1. 指令的寻址方式

    计算机中有两种信息。即指令和数据(或称操作数),它们都存放在存储器相应的地址中。运行程序时,计算机逐条执行指令,并对数据进行处理。如何从存储器中找到所需要的指令或数据呢?很明显,只要找到它们在存储器的有效地址即可。

    所谓寻址方式,就是寻找指令或操作数的有效地址的方式

    1. 顺序寻址方式:按照指令在内存的存放位置顺序地取出指令,然后执行的过程,为顺序寻址方式。
    2. 跳跃寻址方式:程序转移执行的顺序。
顺序寻址

为了达到顺序寻址的目的,CPU中必须有一个程序计数器(PC)对指令的顺序号进行计数。PC中开始时存放程序的首地址,然后每执行一条指令,PC加 1,以指出下条指令的地址,直到程序结束。

https://cdn.jsdelivr.net/gh/adan-ning/images/202404232101114.png

跳跃寻址

当程序中出现分支或循环时,就会改变程序的执行顺序。此时,对指令寻址就要采取跳跃寻址方式。所谓跳跃,就是指下条指令的地址不是通过程序计数器PC加1获得的,而是由指令本身给出

https://cdn.jsdelivr.net/gh/adan-ning/images/202404232102905.png

隐含寻址

这种类型的指令,不是明显地给出操作数的地址,而是指令中隐含着操作数的地址。

在指令中不明显的给出而是隐含着操作数的地址。例如,单地址的指令格式,没有在地址字段中指明第二操作数地址,而是规定累加寄存器AC作为第二操作数地址,AC对单地址指令格式来说是隐含地址

立即寻址

指令的地址字段指出的不是操作数的地址,而是操作数本身,这种寻址方式称为立即寻址。立即寻址方式的特点是指令执行时间很短,因为它不需要访问内存取数,从而节省了访问内存的时间

例如:单地址的移位指令格式为

https://cdn.jsdelivr.net/gh/adan-ning/images/202404232106561.png

这里,D不表示地址,而是表示某寄存器中存放的操作数需要移位的次数,因此D可看做移位指令的操作数。F为标志位,当F=1时,进行右移;当F=0时,进行左移。

直接寻址

直接寻址是一种基本的寻址方法,其特点是:在指令格式的地址字段中直接指出操作数在内存的地址D。由于操作数的地址直接给出而不需要经过某种变换或运算,所以称这种寻址方式为直接寻址方式。

https://cdn.jsdelivr.net/gh/adan-ning/images/202404232107609.png

间接寻址

间接寻址是相对于直接寻址而言的,在间接寻址的情况下,指令地址字段中的形式地址D不是操作数的真正地址,而是操作数地址的指示器,或者说D单元的内容才是操作数的有效地址。

https://cdn.jsdelivr.net/gh/adan-ning/images/202404232108531.png

寄存器寻址和寄存器间接寻址方式

当操作数不放在内存中,而是放在中央处理器的通用寄存器中时,可采用寄存器寻址方式。显然,此时指令中给出的操作数地址不是内存的地址单元号,而是通用寄存器的编号,操作数在CPU的内部寄存器中。如:(AX,BX,CX,DX)

寄存器间接寻址方式与寄存器寻址方式的区别在于:指令格式中的寄存器内容不是操作数,而是操作数的地址,该地址指明的操作数在内存中。

相对寻址

程序计数器PC的内容加上指令格式中的形式地址D而形成操作数有效地址。程序计数器的内容就是当前指令的地址。

因此,所谓“相对”寻址,就是相对于当前指令地址而言。采用相对寻址方式的好处是程序员勿需用指令的绝对地址编程,因而所编程序可以放在内存任何地方。

https://cdn.jsdelivr.net/gh/adan-ning/images/202404232109541.png

变址和基址寻址方式

变址寻址方式与基址寻址方式有点类似,它们都是把某个变址寄存器或基址寄存器的内容,加上指令格式中的形式地址而形成操作数的有效地址。

但使用变址寻址方式的目的不在于扩大寻址空间,而在于实现程序块的规律变化。

https://cdn.jsdelivr.net/gh/adan-ning/images/202404232109411.png

复合寻址方式

复合寻址方式是把间接寻址方式同相对寻址方式或变址相结合而形成的寻址方式。它分为先间接方式与后间接方式两种

  1. 变址间接式

    这种寻址方式是先把变址寄存器的内容A和形式地址D相加得A+D,然后间接寻址,求得操作数的有效地址。操作数的有效地址为E=(A+D)

    https://cdn.jsdelivr.net/gh/adan-ning/images/202404232110641.png

  2. 间接变址式

    1. 这种寻址方式是先将形式地址取间接变换(D)=N然后把N和变址寄存器的内容A相加,即得操作数的有效地址。
    2. 操作数的有效地址表达式为E=A+(D)=A+N

    https://cdn.jsdelivr.net/gh/adan-ning/images/202404232111196.png

块寻址

通常在指令中指出数据块的起始地址和数据块的长度,常用在输入输出指令中

多用于I/O指令。对顺序连续的成块数据字进行寻址

目的:压缩程序的长度,加块执行速度

用于

  1. 两个部件间的数据交换
  2. 程序,数据块的浮动。

若块的长度可变,格式如下

https://cdn.jsdelivr.net/gh/adan-ning/images/202404232112845.png

段寻址

以8086的段寻址为例。这种寻址方式的实质是基址寻址。Intel 8086/8088微机中,ALU16位运算,但其寻址范围可到1M,即地址有20位。

https://cdn.jsdelivr.net/gh/adan-ning/images/202404232112159.png

操作数寻址方式设计的要求

  1. 指令内包含的地址尽可能短;

    短地址指令占存储空间小,且能减少存储时间。

  2. 能访问尽可能大的存储空间

  3. 地址能隐含在寄存器里;

    寄存器字长与机器字长相同,一般对应整个存储空间。这样在发生大跨步跳跃时,用短指令也行

  4. 希望在不改变指令的情况下改变地址的实际值;能够处理数组,表格或数据串。

  5. 寻址方式尽可能简单

例:一种二地址RS型指令的结构如下所示

https://cdn.jsdelivr.net/gh/adan-ning/images/202404232114807.png

分析指令格式及寻址方式特点

https://cdn.jsdelivr.net/gh/adan-ning/images/202404232115174.png

指令格式及寻址方式的特点如下:

  1. 单字长二地址指令;RR型
  2. 操作码可指定16条指令
  3. 源和目的均有8种寻址方式;
  4. 源地址寄存器和目的地址寄存器均有8个

堆栈寻址方式

堆栈——能存取数据的暂时存储单元.

  1. 串联堆栈

    一组专门的寄存器,一个R保存一个数据。

    数据的传送在栈顶和累加器之间进行。

    特点:速度高,后进先出。

    https://cdn.jsdelivr.net/gh/adan-ning/images/202404232124035.png

  2. 存储器堆栈

    用一部分主存空间作堆栈.

    优点

    1. 长度可随意;
    2. 堆栈的数目可随意指定;
    3. 寻址简单——–用访内指令.

    硬件支持:

    SP—堆栈指示器(栈指针),CPU中一个专门寄存器。

    SP的内容是栈顶的单元地址。改变SP的内容即可移动栈顶的位置

    注意:主存中某一部分作为堆栈区后,该部分不能作其它用途

    1. 进栈——–累加器中的数送堆栈保存

      https://cdn.jsdelivr.net/gh/adan-ning/images/202404232126908.png

    2. 出栈——-将堆栈中的数取出送累加器

      https://cdn.jsdelivr.net/gh/adan-ning/images/202404232127585.png

8086 堆栈指令

设sp的初值 MOV sp, im

采用下推式 (PUSH DOWN)

堆栈的最大容量为sp的初值与ss间的距离。

例:PUSH AX

https://cdn.jsdelivr.net/gh/adan-ning/images/202404232128672.png

注意:

存储器堆栈中,进栈时先存入数据,后修改堆栈指示器;出栈时,先修改堆栈指示器,然后取出数据。

典型指令

  1. 一台计算机最基本的、必不可少的指令是不多的,因为很多指令都可以用这些最基本的指令组合来实现

  2. 既可以直接用硬件实现,也可以用其他指令编成子程序来实现,但两者在执行时间上差别很大,因此在指令系统中,有相当一部分指令是为了提高程序的执行速度和便于程序员编写程序而设置的

  3. 另外,指令系统的有效性还表现在用它所编制的程序占用的存储器空间小。

  4. 分类(8088/8086)

    1. 数据传送类

      取数 MOV AX,TEMP

      存数 MOV TEMP,AX

      传送 MOV AX,CX

    2. 算术运算类

      定点+,-,×,÷,ADD,ADC(带进位加法),INC(自加1),SUB,DEC(操作数减1),MUL(乘),DIV(除)等

      浮点+,-,×,÷ ,求反,求补 NEG,比较 CMP

    3. 逻辑运算类

      NOT,AND,OR,XOR,TEST(不保存结果的AND)

    4. 程序控制类

      无条件转移 JMP

      条件转移 C,Z,S,P,O

      转子程序 JSR

      子程序返回 RET

      中断返回 IRET

    5. 输入/输出类

      IN  AX,n               OUT  n, AX
      
    6. 其他类

      标志操作

      CLC(clear  carry flag)
      STC (set carry flag)                                
      CLI (clear interrupt elable flag)
      HLT,WAIT,ESC,LOCK
      

指令和指令系统——指令的使用

https://cdn.jsdelivr.net/gh/adan-ning/images/202404232133384.png

https://cdn.jsdelivr.net/gh/adan-ning/images/202404232133133.png

CISC和RISC

  1. CISC:复杂指令系统
  2. RISC:精简指令系统
  3. CISC的问题
    1. 庞大的指令集
    2. 纷繁复杂的寻址模式
    3. 硬件实现复杂(硬件资源的利用率低)
精简指令集结构
  1. RISC的理由
    1. 减小代码空间
  2. 精简指令集结构的特征
    1. 每周期一条指令
    2. 寄存器-寄存器操作(除Load/Store类型结构
    3. 简单的寻址方式
    4. 简单的指令格式
  3. RISC指令系统的最大特点是:
    1. 选取使用频率最高的一些简单指令,指令条数少;
    2. 指令长度固定,指令格式种类少;
    3. 只有取数/存数指令访问存储器,其余指令的操作都在寄存器之间进行。