4.2 指令的寻址方式

指令寻址(先)

指令寻址:寻找 下一条 将要执行 ==指令== 的 ==指令地址==

  • 程序总是根据 PC的内容 去主存取指令的。

    • PC的位数 取决于存储器总字数 N,按字寻址时,位数 =log2N
    • PC可表示的范围 N
  • 每一条指令的执行都分为:==“取指令”==,“执行指令”两个阶段

    • ==PC+1是发生在 取指令 之后!==
  • 顺序寻址:PC(程序计数器) ==+ “1”==(1指的是指令字长)【定长】

image-20260224115835279
  • 跳跃寻址:通过转移类指令实现。

数据寻址(后)

==数据寻址:寻找 本条指令 的地址码指明的 真实地址==

  • ==数据寻址既是在找地址,也是在找操作数——找地址是手段,获取操作数是目的。==

方式:10种。故通常在指令字段中设置寻址特征字段来标记是哪种寻址方式。

  • ==通用格式:| 操作码 | 寻址特征 | 形式地址A |== (为了简便此处都是用单地址而非多地址的形式)

    • (操作码位数看有多少操作。寻址特征位数看有几种寻址方式)
  • 形式地址==A==,有效(真实)地址==EA==(effective address)

  • (A)表示地址A的数值,A既可以是寄存器编号,也可以是内存地址。

直接寻址

  • | LDA | 直接寻址特征 | A |
  • 最直接的。操作数的真实地址就是形式地址 A 。即 EA = A
  • 优缺:最简单,指令执行阶段只访存一次。A的位数限制了操作数的寻址范围,且操作数的地址不易更改。
  • 适合:指令放置位置是 从内存0开始的?
image-20260224124950754 image-20260224132727635

间接寻址

  • | OP | 间接寻址特征位 | A |
  • 指令的字段给出的不是操作数真实地址,而是真实(有效)地址所在的主存单元的地址。 即 EA = (A)
  • 优缺:可扩大寻址范围(EA可能存放的单元范围),且便于编制程序(多次间接 )。指令执行阶段要多次访存,慢。
image-20260224125324320

寄存器寻址

  • | OP | 寻址特征 | Rī |

  • 指令字段给出的是操作数所在的寄存器编号。 即 EA = Rī

  • 优缺:指令执行阶段不用访存,访问寄存器,fast,且地址码位数更少,指令字长短。寄存器贵,数量有限。

image-20260224125712241

寄存器间接寻址

  • 间接寻址+寄存器寻址。 即 EA = (Rī)
  • 优缺:相比于间接,减少了访存次数(only 1)。相比于寄存器,多了内存访存。
image-20260224125853142

隐含寻址

  • 不直接而是隐含 操作数的地址。(eg单地址的指令割术就隐含约定第二个操作数由累加器(ACC)提供)
  • 优缺:利于缩短指令字长。需增加存储操作数或隐含地址的硬件。
image-20260224125953042

立即(数)寻址

  • | OP | # | A |

  • 指令字的地址字段给出的不是操作数的地址,而是操作数本身(也称立即数,补码形式出现)!(全过程只在取指令访存一次)

  • 优缺:指令执行阶段不访存,fast。A的位数限制了立即数的范围。

偏移寻址

0.补充内容
  • 以某个地址作为起点,另外一个作为偏移量
  • ==补码:==
    • 6位补码表示范围是-32~+31
    • 补码扩充问题,因为数相加减时得同位数,正数前面添0,负数前面添1(FFF)
    • Imm8 – 8位补码
  • 标志寄存器:
    • ZF:是否为零
    • SF:结果的符号位
    • OF:有符号数运算是否溢出
    • CF:无符号数运算是否产生借位
  • sizeof(double)=8
a.相对寻址
  • 以**程序计数器PC ** ==所指的地址==作为“起点”
  • EA = (PC) + A
  • 【A是相对PC所指地址的偏移量,可正可负,补码表示】【寻址范围:2^A的位数】
  • (ACC加法指令的地址码,可以采用“分段”的方式将程序段数据段分开,eg可解决M行的问题)
  • 优 :便于程序的浮动(一段代码在程序中的浮动),用于转移指令。

image-20260224201550545

b.基址寻址
  • 程序的起始存放地址作为“起点”

  • 有效地址 = 形式地址 A + 基址寄存器BR(base address register)的内容 。 即 EA = (BR) + A

  • 其中BR既可以用专属寄存器,也可用某个通用寄存器

  • 优缺:扩大寻址范围,便于程序“浮动”,实现多道程序并发运行。偏移量(形式地址A)的位数较短。

image-20260224131226141 image-20260224132911661
c.变址寻址
  • 有效地址 = 形式地址A + 变址寄存器(IX)的内容。 即 EA = (IX) + A
  • IX(index register)(作为偏移量)可以用专用的,也可以用通用的。形式地址A不变(作为基地址)
  • 优缺: 扩大寻址范围,且适合编址循环程序。
  • 基址寻址VS变址寻址
    • 基址寻址面向操作系统,主要用于为多道程序或数据分配存储空间
      • BR的内容由OS确定且不可变,A可变
    • 变址寻址面向用户,主要用于处理数组问题
      • IX的内容由用户设定且可变,而指令字中的A是不可变的
image-20260224152357049 image-20260224195804765 image-20260224200535110

堆栈寻址

  • 堆栈是主存(或寄存器)中一块特定的,按FILO原则管理的存储区

    • 硬堆栈:寄存器堆栈
    • 软堆栈:主存中划分出区域
  • 操作数存放在堆栈中,隐含使用堆栈指针(SP,Stack Pointer)作为操作数地址

image-20260224203141085

  • 软堆栈
  • 硬堆栈,速度快,成本高。

总结

寻址方式 有效地址 (指令执行阶段)访存次数
直接寻址 EA = A 1
间接寻址(一次) EA = (A) 2
寄存器寻址 EA = Ri 0
寄存器间接寻址(一次) EA = (RI) 1
立即寻址 A即是操作数 0
隐含寻址 程序指定 0
相对寻址(转移指令) EA = (PC) + A 1
基址寻址(多道程序) EA = (BR) + A 1
变址寻址(循环程序) EA = (IX) + A 1
堆栈寻址 入栈/出栈EA的确定方式不同 硬堆栈不访存,软堆栈访存1次

大题T 7-8留着有时间做