【计算机组成原理】指令系统(三)—— 指令寻址与数据寻址

  • 一、指令寻址
    • 顺序寻址
    • 跳跃寻址
    • 指令寻址总结
  • 二、数据寻址
    • (一)、六种简单寻址
      • 1. 隐含寻址
      • 2. 立即寻址
      • 3. 直接寻址
      • 4. 间接寻址
      • 5. 寄存器寻址
      • 6.寄存器间接寻址
    • (二)、偏移寻址
      • 7. 相对寻址(PC)
      • 8. 基址寻址(BR —— base address register)
      • 9. 变址寻址(IX — index register)
    • (三)、特殊寻址方式
      • 10. 堆栈寻址
        • 硬堆栈与软堆栈
    • (四)、数据寻址总结
  • 三、CISC 和 RISC
    • CISC和RISC的对比

一、指令寻址

指令寻址:下一条欲执行指令的地址(始终由程序计数器PC给出)。

指令寻址最主要的就是确定 PC 的值,其在不同的情况下的计算是不同的,不能仅仅使用 PC = ( PC ) + 1 计算。根据编址方式的不同或者指令长度的不同,可能是加2也可能直接赋一个值。

顺序寻址

  • PC = ( PC ) + 1 的情况

  • PC = ( PC ) + 2 的情况

  • PC = ( PC ) + n 的情况

采用变长指令字结构时,读入一个字,根据操作码判断这条指令的总字节数 n,修改PC的值。

跳跃寻址

跳跃寻址: 由转移指令指出 PC 的值

分析:执行完序号3的指令时,此时 PC 的值为4,指向图中蓝色方框的指令。但是使用 转移指令JMP 后,PC 的值变为 7, 指向的指令为序号为7的指令:‘LDA 1100’

指令寻址总结

二、数据寻址

数据寻址:确定 本条指令的地址码指明的真实地址

数据寻址有如上图所示方式,为了标识数据寻址的方式,在指令结构中增加了 寻址方式位 这一字段。

(一)、六种简单寻址

1. 隐含寻址

隐含寻址:不是明显地给出操作数的地址,而是在指令中隐含着操作数的地址 。

优点:有利于缩短指令字长。 缺点:需增加存储操作数或隐含地址的硬件。

2. 立即寻址

立即寻址:形式地址A就是操作数本身,又称为立即数,一般采用补码形式

一条指令的执行:取指令 访存1次;执行指令 访存0次;暂不考虑存结果共访存1次。

优点:指令执行阶段不访问主存,指令执行时间最短。 缺点:A 的位数限制了立即数的范围。如 A 的位数为 n,且立即数采用补码时,可表示的数据范围为 − 2 n − 1 ~ 2 n − 1 − 1 -2^{n-1}~2^{n-1}-1 2n12n11.

3. 直接寻址

直接寻址:指令字中的形式地址A就是操作数的真实地址 EA,即EA=A 。

一条指令的执行:取指令 访存1次, 执行指令 访存1次 ,暂不考虑存结果共访存2次

优点:简单,指令执行阶段仅访问一次主存,不需专门计算操作数的地址。 缺点:A的位数决定了该指令操作数的寻址范围。操作数的地址不易修改。

4. 间接寻址

间接寻址:指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,即 EA=(A) 。

优点:可扩大寻址范围(有效地址EA的位数大于形式地址A的位数)。便于编制程序(用间接寻址可以方便地完成子程序返回)。

缺点:指令在执行阶段要多次访存(一次间址需两次访存,多次寻址需根据存储字的最高位确定几次访存)。

5. 寄存器寻址

寄存器寻址:在指令字中直接给出操作数所在的寄存器编号,即 EA = R i R_i Ri ,其操作数在由 R i R_i Ri 所指的寄存器内。

一条指令的执行:取指令 访存1次;执行指令 访存0次;暂不考虑存结果共访存1次。

优点:指令在执行阶段不访问主存,只访问寄存器,指令字短且执行速度快,支持向量/矩阵运算。

缺点:寄存器价格昂贵,计算机中寄存器个数有限 。

6.寄存器间接寻址

寄存器间接寻址:寄存器 R i R_i Ri 中给出的不是一个操作数,而是操作数所在主存单元的地址,即 EA = ( R i R_i Ri) 。

一条指令的执行:取指令 访存1次;执行指令 访存1次;暂不考虑存结果共访存2次。

特点:与一般间接寻址相比速度更快,但指令的执行阶段需要访问主存(因为操作数在主存中)。

(二)、偏移寻址

  • 相对寻址:以程序计数器PC所指地址作为“起点”。 EA = (PC)+A
  • 基址寻址:以程序的起始存放地址作为“起点”。 EA = (BR)+A
  • 变址寻址:程序员自己决定从哪里作为“起点”。 EA = (IX)+A

7. 相对寻址(PC)

相对寻址:把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址,即 EA=(PC)+A,其中 A是相对于PC所指地址的位移量,可正可负,补码表示 。

  • 相对寻址的作用

优点:操作数的地址不是固定的,它随着PC值的变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序浮动(一段代码在程序内部的浮动)。 相对寻址广泛应用于转移指令。

8. 基址寻址(BR —— base address register)

基址寻址:将**CPU中基址寄存器(BR)**的内容加上指令格式中的形式地址A,而形成操作数的有效地址,即 EA= (BR)+A。

注:“重定位寄存器”就是“基址寄存器”

  • 采用专用寄存器和采用通用寄存器两种方式作为基址寄存器。
  • 采用通用寄存器作为基址寄存器时,在指令中指明,要将哪个通用寄存器作为基址寄存器使用。

注: (1)基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定。在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)。 (2)当采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但其内容仍由操作系统确定

  • 基址寻址的作用

程序运行前,CPU将BR的值修改为该程序的起始地址(存在操作系统PCB中)

优点:可扩大寻址范围(基址寄存器的位数大于形式地址A的位数);用户不必考虑自己的程序存于主存的哪一空间区域,故有利于多道程序设计,便于程序“浮动”。采用基址寻址无需修改指令中的地址码。

9. 变址寻址(IX — index register)

变址寻址:有效地址EA 等于指令字中的形式地址A与变址寄存器IX的内容相加之和,即 EA= (IX)+A,其中 IX可为变址寄存器(专用),也可用通用寄存器作为变址寄存器

注:变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变(作为偏移量),形式地址A不变(作为基地址) 。

优点:在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序

(三)、特殊寻址方式

10. 堆栈寻址

堆栈寻址:操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址。 【SP — Stack Pointer】

堆栈是存储器(或专用寄存器组)中一块特定的按“后进先出(LIFO)” 原则管理的存储区,该存储区中被读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)。

以上述堆栈形式实现一次加法操作。记栈顶单元为Msp

步骤一:POP ACC 取栈顶元素到 ACC寄存器

(Msp) → ACC(SP)+1 → SP

步骤二:POP X 取栈顶元素到 X寄存器

(Msp) → X(SP)+1 → SP

步骤三:ADD Y

(ACC)+(X) → Y

步骤四:PUSH Y

(SP)-1 → SP(Y) → Msp

硬堆栈与软堆栈

硬堆栈:寄存器堆栈。 软堆栈:从主存中划出一段区域来做堆栈。

(四)、数据寻址总结

注意:取出当前指令后, PC会指向下一条指令,相对寻址是相对于下一条指令的偏移。

三、CISC 和 RISC

CISC: Complex Instruction Set Computer 设计思路:一条指令完成一个复杂的基本功能。 代表:x86架构,主要用于笔记本、台式机等。

RISC: Reduced Instruction Set Computer 设计思路:一条指令完成一个基本“动作”;多条指令组合完成一个复杂的基本功能。 代表:ARM架构,主要用于手机、平板等。

比如设计一套能实现整数、矩阵加/减/乘运算的指令集:

CISC的思路:除了提供整数的加减乘指令除之外,还提供矩阵的加法指令、矩阵的减法指令、矩阵的乘法指令。 一条指令可以由一个专门的电路完成,有的复杂指令用纯硬件实现很困难 → 采用“存储程序”的设计思想,由一个比较通用的电路配合存储部件完成一条指令

RISC的思路:只提供整数的加减乘指令 一条指令一个电路,电路设计相对简单,功耗更低,“并行”、“流水线”

CISC和RISC的对比

注:乘法指令可以访存,一定是 CISC