文章目录
- 前言
前言
本文简单介绍了各种寻址方式。在计算机体系结构和指令集设计中,寻址方法(Addressing Mode)是指 CPU 指令如何访问操作数(数据)的方式。不同的寻址方法会影响指令的灵活性、执行效率和编程便利性。以下是常见的寻址方式及其特点:
- 立即寻址(Immediate Addressing)
操作数直接包含在指令中,无需访问内存。
特点:速度快,但数据大小受限(如 8/16/32 位立即数)。
示例:
assembly
MOV R1, #42 ; R1 = 42(立即数42直接存入寄存器R1)
2. 寄存器寻址(Register Addressing)
操作数存放在CPU寄存器中,指令直接访问寄存器。
特点:速度最快(无需访存),但寄存器数量有限。
示例:
assembly
ADD R2, R1, R3 ; R2 = R1 + R3(R1和R3是寄存器)
3. 直接寻址(Direct Addressing / Absolute Addressing)
指令中直接给出操作数的内存地址。
特点:访问固定内存位置,但地址编码可能较长。
示例:
assembly
MOV R1, [0x1000] ; R1 = 内存地址0x1000处的值
4. 寄存器间接寻址(Register Indirect Addressing)
操作数的地址存放在寄存器中,指令通过寄存器间接访问内存。
特点:灵活(可动态计算地址),但需额外访存。
示例:
assembly
MOV R1, [R2] ; R1 = 内存地址(R2的值)处的数据
5. 基址寻址(Base Addressing)
操作数地址 = 基址寄存器 + 偏移量(常量或寄存器)。
特点:适用于数组、结构体访问(如 array[i])。
示例:
assembly
MOV R1, [R2 + 4] ; R1 = 内存地址(R2 + 4)处的数据
6. 变址寻址(Indexed Addressing)
操作数地址 = 基址 + 变址寄存器 × 比例因子。
特点:适合遍历数组(如 array[i] 其中 i 可变)。
示例:
assembly
MOV R1, [R2 + R3*2] ; R1 = 内存地址(R2 + R3×2)处的数据
7. 相对寻址(Relative Addressing / PC-Relative)
操作数地址 = 当前PC(程序计数器) + 偏移量。
特点:用于跳转指令(如 JMP、CALL),实现位置无关代码(PIC)。
示例:
assembly
JMP +0x20 ; 跳转到当前指令地址 + 0x20
8. 堆栈寻址(Stack Addressing)
操作数通过堆栈指针(SP)隐式访问(如 PUSH/POP)。
特点:用于函数调用、局部变量存储。
示例:
assembly
PUSH R1 ; 将R1压入堆栈(SP -= 4,[SP] = R1)
POP R2 ; 从堆栈弹出到R2(R2 = [SP],SP += 4)
9. 隐含寻址(Implied Addressing)
操作数由指令本身隐含指定(无显式地址字段)。
特点:指令简短,但灵活性低。
示例:
assembly
CLC ; 清除进位标志(隐含操作CF=0)
10. 间接寻址(Indirect Addressing)
操作数的地址存储在另一个内存位置(多级指针)。
特点:支持动态内存访问(如指针解引用),但效率较低。
示例:
assembly
MOV R1, [[0x1000]] ; R1 = 内存地址(内存地址0x1000处的值)处的数据
不同架构的寻址方式差异
x86:支持复杂寻址(如 [eax + ebx*4 + 0x10])。
ARM:主要使用基址+偏移或寄存器间接寻址。
RISC-V:简化寻址模式(仅支持基址+立即数偏移)。
总结
寻址方式 特点 典型应用场景
立即寻址 操作数在指令中 常量赋值(MOV R1, 5)
寄存器寻址 操作数在寄存器 算术运算(ADD R1, R2)
直接寻址 操作数在固定内存地址 全局变量访问
寄存器间接寻址 操作数地址在寄存器 指针解引用(MOV R1, [R2])
基址/变址寻址 基址 + 偏移量 数组/结构体访问
相对寻址 PC + 偏移量 跳转指令(JMP +0x10)
堆栈寻址 通过SP隐式访问 函数调用(PUSH/POP)
理解寻址方式对编写高效汇编代码和优化程序性能至关重要。