细分两种变址寻址🤔

1. 变址寻址 (Indexed Addressing)

总结对比表

寻址方式 有效地址 EA 的计算公式 操作数位置 访存次数 主要用途
立即 (无,操作数在指令中) 指令内部 0 赋常量
直接 EA = D 主存 1 访问静态变量
间接 EA = (D) 主存 2 指针、动态内存
寄存器 (无,操作数在寄存器中) 寄存器 0 高频数据操作
寄存器间接 EA = (R) 主存 1 按地址访问数据结构
变址 EA = D + (IX) 主存 1 数组遍历
基址 EA = (BR) + D 主存 1 程序重定位
相对 EA = (PC) + D (这是转移地址) 指令流(下一条指令) 1 (取指) 程序分支、循环

注: D=指令中的形式地址, R=通用寄存器, IX=变址寄存器, BR=基址寄存器, PC=程序计数器, (X)=X的内容。访存次数指为获取一个操作数而访问主存的次数。

一、 答案

在现代计算机中,变址寄存器通常存放的是原始的数组下标,由CPU硬件在计算有效地址时**自动完成“下标乘以元素大小”**这个操作;但在简化的教学模型或一些早期设计中,也可能是要求程序员(或编译器)事先算好偏移量(即下标 * 元素大小)再放入变址寄存器。

二、两种变址寻址

变址寻址的两种实现模式:基础变址寻址比例变址寻址 (Scaled Indexed Addressing)

模式一:基础模型(编译器/程序员负责计算偏移量)

在这种简化的、经典的教学模型中,CPU的地址生成单元只包含一个加法器。

伪代码示例 (访问 arr[i], int类型):

代码段

; 假设 i 存放在 CX 寄存器中
MOV  AX, CX      ; 将 i 复制到 AX
SHL  AX, 2       ; 左移两位,等效于 AX = AX * 4,计算字节偏移量
MOV  SI, AX      ; 将计算好的字节偏移量放入变址寄存器 SI
MOV  BX, arr[SI] ; 执行变址寻址,EA = arr基地址 + (SI)

模式二:比例变址模型(CPU硬件负责计算偏移量)

在现代CPU(如x86系列)中,为了提高处理数组的效率,地址生成单元硬件本身就包含了移位器或乘法器,可以直接处理比例因子。

x86汇编示例 (访问 arr[i], int类型, 即dword):

代码段

; 假设 i 存放在 ECX 寄存器中, arr 基地址在 EBX 中
MOV  EAX, [EBX + ECX * 4]  ; 一条指令完成所有操作