寻址方式

概述

  • 寻址方式是指寻找指令或指令中操作数的有效地址的方式。
    • 有效地址可以是主存地址,也可以是虚拟地址(采用虚拟存储器技术)。

寻址方式

  • 指令寻址方式
    • 顺序寻址
    • 跳跃寻址
  • 操作数寻址方式
    • 立即寻址
    • 直接寻址
    • 间接寻址
    • 寄存器寻址
    • 寄存器间接寻址
    • 相对寻址
    • 变址寻址
    • 基址寻址
    • 堆栈寻址
    • 其他寻址

寻址方式是指令系统的重要组成部分,它对指令的格式和功能设计都有较大的影响。灵活高效的寻址方式不仅能够为程序员提供多样化的程序设计手段,还能显著提升程序的运行速度存储空间的利用率

  • 从程序设计角度看,操作数可能是:
    • 常数
    • 简单变量
    • 数组和结构体中的某个元素
    • 栈 (stack) 中的数据
    • 外设 I/O 接口中的状态字或控制字
  • 从指令角度看,操作数的存放位置可能是:
    • CPU 内的通用寄存器
    • 主存
    • I/O 端口
  • 操作数是程序执行时需要处理的数据,为了满足不同程序设计技巧的需要,操作数的存取方式应该比较灵活多样

指令寻址方式

顺序寻址

指令地址按程序计数器(PC)内容递增方式来获取下一条指令,即 (PC) + 1 -> PC。这是程序正常执行流的基础,程序在内存中连续存放时,CPU 会自动按序取出下一条指令。

跳跃寻址

当程序执行遇到分支、循环、子程序调用或返回指令时,指令地址不再是顺序递增,而是根据指令中给出的地址码或计算出的地址,更新程序计数器(PC),从而使程序跳转到新的指令地址执行。这打破了指令的顺序执行流。

操作数寻址方式

指令中给出操作数的地址信息,用于找到操作数在内存或寄存器中的位置,以便 CPU 执行指令时获取操作数。有效地址(EA)是操作数的实际地址。不同的寻址方式决定了有效地址的计算方法

含有寻址方式的单地址指令格式

  • 操作码 OP
  • 寻址方式 M
  • 形式地址 D

操作数寻址的过程,就是把寻址方式 M 和形式地址 D 的不同组合转换成有效地址的过程。

立即寻址

  • 立即寻址方式下,操作数与指令一起存放在主存中
    • 取指令时,操作数随指令一起被读取并送到 CPU 内的指令寄存器 IR 中
    • 指令执行时,直接从指令寄存器 IR 中获取操作数,无需访问其他存储单元
  • 特点:
    • 取操作数快
    • 形式地址 D 的位宽有限,限制了操作数的表示范围
  • 立即寻址一般用于变量赋初值
MOV EAX,5132408H ;将十六进制立即数5132408送入32位通用寄存器EAX

直接寻址

  • 定义:指令字中的形式地址 D 就是操作数的有效地址 EA。
  • EA 计算
  • 过程
    1. 取指令。
    2. 从指令中取出形式地址 D。
    3. 以 D 作为有效地址 EA,访问存储器,取出操作数。
  • 特点
    • 简单直观
    • 只需一次访存即可取操作数。
    • 形式地址 D 的位数决定了可寻址范围,寻址范围受限
    • 广泛用于访问静态变量或全局变量
  • 示例MOV EAX, [1000H] (将内存地址 1000H 处的数据送入 EAX)

间接寻址

  • 定义:指令字中的形式地址 D 是操作数地址的地址。
  • EA 计算 (表示 D 所指的存储单元内容是有效地址)
  • 过程
    1. 取指令。
    2. 从指令中取出形式地址 D。
    3. 以 D 作为地址,访问存储器,取出有效地址 EA。
    4. 以 EA 作为地址,访问存储器,取出操作数。
  • 特点
    • 寻址范围大(有效地址的位数可以大于形式地址的位数)。
    • 灵活,可实现多级间接寻址。
    • 多次访存(至少两次访存:第一次取有效地址,第二次取操作数)。
    • 可用于实现指针传递参数
  • 示例MOV EAX, [[1000H]] (将内存地址 1000H 处存储的地址所指向的数据送入 EAX)

寄存器寻址

  • 定义:指令字中的形式地址 D 直接指出操作数所在的寄存器编号。
  • EA 计算:操作数在指定的通用寄存器 R 中,无须访存。
  • 过程
    1. 取指令。
    2. 从指令中取出寄存器编号 R。
    3. 直接从寄存器 R 中获取操作数。
  • 特点
    • 最快的寻址方式(无需访存)。
    • 寄存器数量有限,可寻址范围小
    • 操作数在 CPU 内部,提高了 CPU 的工作效率。
  • 示例MOV EAX, EBX (将寄存器 EBX 的内容送入 EAX)

寄存器间接寻址

  • 定义:指令字中的形式地址 D 指出一个寄存器 R 的编号,该寄存器 R 的内容是操作数的有效地址 EA。
  • EA 计算 (表示寄存器 R 的内容是有效地址)
  • 过程
    1. 取指令。
    2. 从指令中取出寄存器编号 R。
    3. 从寄存器 R 中取出有效地址 EA。
    4. 以 EA 作为地址,访问存储器,取出操作数。
  • 特点
    • 比直接寻址快(有效地址在寄存器中,省去一次访存)。
    • 寻址范围大(取决于寄存器位数)。
    • 灵活,可用于实现循环、数组、栈操作等。
    • 类似于直接寻址,但地址存放在寄存器中。
  • 示例MOV EAX, [EBX] (将 EBX 寄存器内容作为地址,取出内存数据送入 EAX)

相对寻址

  • 定义:指令字中的形式地址 D 是相对于程序计数器 PC(Program Counter)内容的偏移量,有效地址是 PC 内容与偏移量之和。
  • EA 计算 (PC 的值通常是下一条指令的地址即译码完成后自增了指令字长)
  • 过程
    1. 取指令。
    2. PC 内容与形式地址 D 相加,得到有效地址 EA
    3. 以 EA 作为地址,访问存储器,取出操作数(或跳转目标地址)。
  • 特点
    • 可实现程序浮动(重定位):程序装入内存的任何位置都能正确执行,无需修改地址。
    • 常用于转移指令(如 JMP、CALL)和访问程序周围的数据
    • 寻址范围相对有限(取决于 D 的位数)。
  • 示例JMP SHORT LABEL (跳转到距当前 PC 地址为 D 的 LABEL 处)

变址寻址

  • 定义:指令字中的形式地址 D(称为基地址或位移量)与变址寄存器 IX(Index Register)的内容相加,得到操作数的有效地址。
  • EA 计算
    • 通常 D 是固定值(如数组首地址),IX 是可变值(如数组下标)。
  • 过程
    1. 取指令。
    2. 将变址寄存器 IX 内容与形式地址 D 相加,得到有效地址 EA。
    3. 以 EA 作为地址,访问存储器,取出操作数。
  • 特点
    • 变址寄存器 n 的内容可变,而形式地址 D 的值设定后在指令执行过程中将保持不变。变址寄存器 n 的位数大于形式地址 D 的位数,扩大了寻址范围(可表示整个存储空间)。
    • 主要应用于对数组元素的访问。将数组的首地址赋值给指令中的形式地址 D,使变址寄存器 n 的值按顺序变化,就可以对数组中的各元素进行相同的操作。
    • 多用于循环中对数据结构进行访问。
  • 示例MOV EAX, [ARRAY_START + EBX*4] (伪指令,表示访问数组 ARRAY_START 中第 EBX 个 DWORD 元素)

基址寻址

  • 定义:指令字中的形式地址 D(称为偏移量或位移量)与基址寄存器 BR(Base Register)的内容相加,得到操作数的有效地址。
  • EA 计算
    • 通常 BR 是固定值(如段基地址),D 是可变值(如段内偏移)。
  • 过程
    1. 取指令。
    2. 将基址寄存器 BR 内容与形式地址 D 相加,得到有效地址 EA。
    3. 以 EA 作为地址,访问存储器,取出操作数。
  • 特点
    • 有利于程序和数据的浮动(重定位):只需修改基址寄存器内容,程序即可在内存中任意位置运行。
    • 支持多道程序设计:每个程序分配一个基址寄存器,实现地址保护。
    • D 通常是段内偏移量,BR 存放段的起始地址。
  • 示例MOV EAX, [DS:BX + 100H] (将 DS 段基址 + BX 寄存器内容 + 100H 作为地址,取出内存数据送入 EAX)
  • 与变址寻址的区别
特征基址寻址变址寻址
固定量基址寄存器 BR 内容形式地址 D
变量形式地址 D变址寄存器 IX 内容
应用场景程序整体浮动、多用户数组、字符串、循环处理

偏移寻址

  • 相对寻址
  • 变址寻址
  • 基址寻址

堆栈寻址

  • 定义:操作数存放在堆栈中,堆栈的存取是按照“后进先出(LIFO)”的原则进行的,通过堆栈指针 SP(Stack Pointer)指示栈顶位置。
  • EA 计算 (堆栈指针 SP 通常指向栈顶元素)
    • 地址通常由硬件隐式决定,无需在指令中显式给出。
  • 过程
    • PUSH 操作(入栈):SP 先修改(递减或递增),再将操作数存入 SP 指向的地址。
    • POP 操作(出栈):SP 指向的地址处操作数取出,再修改 SP(递增或递减)。
  • 特点
    • 操作数地址隐含在堆栈指针中,指令中无需给出地址信息。
    • 隐式寻址
    • 常用于函数调用、参数传递、局部变量存储、中断/异常处理等。
  • 示例PUSH EAX (将 EAX 内容压入栈顶) POP EBX (将栈顶内容弹出到 EBX)

其他寻址

  • 复合寻址方式:主要用于 复杂指令集计算机 通过组合两种或多种基本寻址方式来计算有效地址,以满足更复杂的寻址需求,提供更大的灵活性。
    • 相对寻址 + 间接寻址
      • EA 计算
      • 解释:首先,将程序计数器 PC 的内容与指令中的形式地址 D 相加,得到一个中间地址。然后,将这个中间地址作为指针,去内存中取出真正的有效地址 EA
      • 特点:结合了相对寻址的程序浮动性(重定位)和间接寻址的灵活寻址范围。常用于实现基于 PC 相对位置的跳转表或间接访问数据结构。
    • 变址寻址 + 间接寻址
      • EA 计算
      • 解释:首先,将变址寄存器 IX 的内容与指令中的形式地址 D 相加,得到一个中间地址。然后,将这个中间地址作为指针,去内存中取出真正的有效地址 EA
      • 特点:适用于访问指针数组。例如,D 可以是存储一系列指针的数组的起始地址,IX 可以是数组的下标,通过 (IX) + D 找到某个指针,然后通过间接寻址找到该指针指向的实际数据。
    • 间接寻址 + 变址寻址
      • EA 计算
      • 解释:首先,将指令中的形式地址 D 作为指针,去内存中取出一个基地址(这个基地址是操作数所在数据结构的起始地址)。然后,将这个基地址与变址寄存器 IX 的内容相加,得到最终的有效地址 EA
      • 特点:适用于访问动态数据结构中的元素,其中数据结构的基地址本身存储在内存中(例如,通过一个指针变量来引用)。D 指向存储基地址的内存单元,IX 作为该基地址的偏移量,用于访问结构内的特定元素。

总结

  • 不同指令系统,可能采用了我们所介绍的寻址方式中的一部分。
  • 我们所介绍的操作数寻址方式,都是单地址指令。对于多地址指令,每个地址字段的作用不同,因此每个地址字段都可能有各自的寻址方式(寻址特征)字段。

习题


偏移寻址




  • 多复习了解复合寻址方法,记住名词含义

变址寻址


D=2000H, 8X=100H=256D, X=32


  • 注意基址寄存器的内容主存地址都是无符号数!!

  • 注意 直接寻址 的形式地址的内容是主存地址,都是无符号数!!