Skip to content

(二)寻址

0. 回顾:指令执行过程

image-20250322231937031

1. 指令寻址

1.1. 顺序寻址

  • 概念:让程序计数器 PC 自增,即 PC = PC + 1,指向下一条指令;
  • 情景:除 JMP 指令外,其他指令执行完都会自动操作;

1.2. 跳跃寻址

  • 概念:通过转移指令 JMP x显式地指定 PC 下一次该指向的位置为 x;
  • 情景:实现流程控制,函数调用等;

2. 数据寻址

2.1. 指令格式

  • 格式:操作码 | 寻址特征码 | 形式地址 A
  • 特征码:指示 CPU 应该选用哪种寻址方式;
  • 形式地址 A:操作码中直接给出的地址,并不等于目标操作数的真实地址
  • 有效地址:操作数真实地址,由 CPU 根据特征码和 A 计算得出
  • 约定:指令字长 = 存储字长 = 机器字长;

2.2. 立即寻址

  • 概念:形式地址 A = 操作数自身
  • 特点
    • 指令执行时不用访存,直接进行计算,速度快
    • 数据 A 的范围有限(由位数决定);

2.3. 直接寻址

  • 概念:形式地址 A = 操作数内存地址
  • 特点
    • 需要一次访存,较为简单;
    • 寻址范围有限(由 A 的位数决定);
    • 地址 A 不易修改(指令在执行期间一般不允许修改,只读);
  • 操作数的直接地址又称为 EA;

2.4. 隐含寻址

  • 概念:A 给出一个操作数的内存地址,另一个数存储在寄存器中(如 ACC);
  • 特点:可以缩短指令字长,其他和直接寻址相同;
  • 注意
    • 寄存器中的直接就是操作数,不是地址了;

2.5. 间接寻址

  • 概念:形式地址 A = 指针 P 内存地址,指针 P 指向内存中的操作数;
  • 特点
    • 需要两次访存;
    • 寻址范围较大,方便编制程序
    • 可扩展为多级间接寻址:规定最高位为 1 的都是间接地址,为 0 的才是 EA;

2.6. 寄存器寻址

  • 概念:形式地址 A = 寄存器地址 R,操作数存放在 R 中;
  • 考研最常考的寻址方法;
  • 特点
    • 不用访存,而是访问寄存器,速度快;
    • 寄存器个数少,因此地址短,可缩短指令字长;

2.7. 寄存器间接寻址

  • 概念:类似 2.6,但是寄存器 R 里存放的是 EA
  • 特点
    • 需要访存;
    • 一般用来编制循环程序

2.8. 基址寻址

  • 概念:形式地址 A + 基址寄存器 BR 的值 = 有效地址
  • 特点
    • 寻址范围大;
    • 有利于多道程序管理;
    • BR 的值由 OS 管理,程序执行过程中 BR 值不变,形式地址 A 可变;
    • 方便程序分区存储和管理

2.9. 变址寻址

  • 概念:形式地址 A + 变址寄存器 IX 的值 = 有效地址
  • 特点
    • 寻址范围大;
    • IX 的值由用户给定,程序执行过程中 IX 可变,形式地址 A 不变
    • 一般用来处理数组问题
  • 实例分析:循环数组访问 A[i], i = 1 ... N-1
    • 数组首地址 A:一般由形式地址给出;
    • 下标(偏移)i:每次循环写入 IX 寄存器,实现连续访问;

2.10. 相对寻址

  • 概念:形式地址 A + 程序计数器 PC 的值 = 有效地址
  • 特点
    • 寻址范围较小,由 A 决定;
    • 一般用于转移指令;
    • 可实现程序浮动;

2.11. 堆栈寻址

  • 概念:不用给出形式地址 A (?),默认操作数地址存放在栈顶,栈顶地址由固定的 SP 寄存器给出;

  • 特点

    • 本质可视为一种寄存器间接寻址;
    • 分为硬堆栈软堆栈两种;
      • 硬堆栈:利用寄存器组实现堆栈,此时不需要访存
      • 软堆栈:在内存中划出一片区域实现堆栈,需要访存
  • 关于栈顶和 SP

    image-20250322235154150

    • 栈的地址是从高地址到低地址排列的,即栈底在高地址,固定;栈顶在低地址,可浮动;
    • SP 指向的是当前栈顶地址;
    • 进栈:SP = SP - 1,同时将数据存放到 SP 指向的内存单元;
    • 出栈:将 SP 指向的内存数据读出,然后 SP = SP + 1;

2.12. 总结表格

  • (X) 表示对地址 X 进行一次间接寻址,即取出内存中地址 X 的内存单元的值
寻址方式有效地址访存次数应用场景/备注
立即寻址A 表示操作数0
隐含寻址指令规定0缩短指令长度
直接寻址EA=A1
一次间接寻址EA=(A)2
N 次间接寻址EA=((A))NN + 1
寄存器 (直接) 寻址EA=Ri0
寄存器间接 (一次) 寻址EA=(Ri)1
相对寻址EA=(PC)+A1程序浮动/转移
基址寻址EA=(BR)+A1循环/多道程序
变址寻址EA=(IX)+A1数组问题
堆栈寻址 (硬堆栈)EA=(SP)0硬堆栈无需寻址
堆栈寻址 (软堆栈)EA=(SP)1软堆栈 1 次寻址

习题

    1. 间址寄存器 X,形式地址 D。采用先间址后变址的寻址方式,则有效地址为
    • A. (X)+D
    • B. (X)+(D)
    • C. ((X)+D)
    • D. ((X)+(D))
    • 答案:B
    • 解析:先间址,则对 D 间接寻址得到 (D),然后再变址寻址,则 EA=(X)+(D)
      • 补充说明:D 选项为数据本身,即 Data=(EA)
    1. 机器字长 16 位,按字节编址。转移指令 JMP 采用相对寻址,由 1 字节操作码 + 1 字节偏移量组成。假设取指令时,每取出一个字节 PC 自增 1,若某条 JMP 指令地址为 0x2000,偏移量 0x06,则该转移指令执行后,PC 指向的地址为
    • A. 0x2006;
    • B. 0x2007;
    • C. 0x2008;
    • D. 0x2009;
    • 答案:C
    • 解析:分析执行过程
      • 执行到该 JMP 指令时,PC = 0x2000,此时需要取出该指令
      • 取出该指令后,PC = 0x2002,开始执行,即 PC = PC + Offset;
      • 所以,执行完毕后,PC = 0x2002 + 0x06 = 0x2008;
    1. 转移指令 JMP 占 3 字节(操作码 1B + 偏移量 2B),且数据的低字节地址为字地址。设每取出一个字节,PC 自增 1;
    • 3.1. 若当前 PC = 240,要求执行完 JMP 后转移到 290,求偏移量所在两个字节的机器码;
    • 3.2. 若当前 PC = 240,要求执行完 JMP 后转移到 200,求偏移量所在两个字节的机器码;
    • 答案
      • 1)偏移量 47,第二字节 0010 1111,第三字节 0000 0000;
      • 2)偏移量 -43,补码形式。第二字节 1101 0101,第三字节 1111 1111;
    • 解析
      • 1)还是注意取指时 PC = PC + 3,即开始执行时 PC = 243,然后目标地址相减即可;
      • 2)同上,注意先算补码;
    1. 变址寄存器 (IX)=(1000)16,形式地址 A=(2000)16,且已知三个地址的内容 (0x1000)=(2000)16(0x2000)=(3000)16(0x3000)=(4000)16,则变址寻址得到的操作数为
    • A. 0x1000;
    • B. 0x2000;
    • C. 0x3000;
    • D. 0x4000;
    • 答案:D
    • 解析:变址寻址有 EA=(IX)+A=(3000)16,则操作数为 (EA)=(4000)16