当前位置: 首页 > java >正文

上位机知识篇---寻址方式


文章目录

  • 前言
  • 1. 立即寻址(Immediate Addressing)
    • 特点
    • 示例
  • 2. 寄存器寻址(Register Addressing)
    • 特点
    • 示例
  • 3. 直接寻址(Direct Addressing / Absolute Addressing)
    • 特点
    • 示例
  • 4. 寄存器间接寻址(Register Indirect Addressing)
    • 特点
    • 示例
  • 5. 基址寻址(Base Addressing)
    • 特点
    • 示例
  • 6. 变址寻址(Indexed Addressing)
    • 特点
    • 示例
  • 7. 相对寻址(Relative Addressing / PC-Relative)
    • 特点
    • 示例
  • 8. 堆栈寻址(Stack Addressing)
    • 特点
    • 示例
  • 9. 隐含寻址(Implied Addressing)
    • 特点
    • 示例
  • 10. 间接寻址(Indirect Addressing)
    • 特点
    • 示例
  • 不同架构的寻址方式差异
    • x86
    • ARM
    • RISC-V
  • 总结


前言

本文简单介绍了各种寻址方式。在计算机体系结构和指令集设计中,寻址方法(Addressing Mode)是指 CPU 指令如何访问操作数(数据)的方式。不同的寻址方法会影响指令的灵活性、执行效率和编程便利性。以下是常见的寻址方式及其特点:


1. 立即寻址(Immediate Addressing)

操作数直接包含在指令中,无需访问内存。

特点

特点:速度快,但数据大小受限(如 8/16/32 位立即数)。

示例

MOV R1, #42    ; R1 = 42(立即数42直接存入寄存器R1)

2. 寄存器寻址(Register Addressing)

操作数存放在CPU寄存器中,指令直接访问寄存器

特点

特点:速度最快(无需访存),但寄存器数量有限。

示例

ADD R2, R1, R3 ; R2 = R1 + R3(R1和R3是寄存器)

3. 直接寻址(Direct Addressing / Absolute Addressing)

指令中直接给出操作数的内存地址

特点

特点:访问固定内存位置,但地址编码可能较长。

示例

MOV R1, [0x1000] ; R1 = 内存地址0x1000处的值

4. 寄存器间接寻址(Register Indirect Addressing)

操作数的地址存放在寄存器中,指令通过寄存器间接访问内存。

特点

特点:灵活(可动态计算地址),但需额外访存。

示例

MOV R1, [R2] ; R1 = 内存地址(R2的值)处的数据

5. 基址寻址(Base Addressing)

操作数地址 = 基址寄存器 + 偏移量(常量或寄存器)

特点

特点:适用于数组、结构体访问(如 array[i])。

示例

MOV R1, [R2 + 4] ; R1 = 内存地址(R2 + 4)处的数据

6. 变址寻址(Indexed Addressing)

操作数地址 = 基址 + 变址寄存器 × 比例因子

特点

特点:适合遍历数组(如 array[i] 其中 i 可变)。

示例

MOV R1, [R2 + R3*2] ; R1 = 内存地址(R2 + R3×2)处的数据

7. 相对寻址(Relative Addressing / PC-Relative)

操作数地址 = 当前PC(程序计数器) + 偏移量。

特点

特点:用于跳转指令(如 JMP、CALL),实现位置无关代码(PIC)。

示例

JMP +0x20 ; 跳转到当前指令地址 + 0x20

8. 堆栈寻址(Stack Addressing)

操作数通过堆栈指针(SP)隐式访问(如 PUSH/POP)。

特点

特点:用于函数调用、局部变量存储。

示例

PUSH R1   ; 将R1压入堆栈(SP -= 4,[SP] = R1)
POP R2    ; 从堆栈弹出到R2(R2 = [SP],SP += 4)

9. 隐含寻址(Implied Addressing)

操作数由指令本身隐含指定(无显式地址字段)。

特点

特点:指令简短,但灵活性低。

示例

CLC       ; 清除进位标志(隐含操作CF=0)

10. 间接寻址(Indirect Addressing)

操作数的地址存储在另一个内存位置(多级指针)。

特点

特点:支持动态内存访问(如指针解引用),但效率较低。

示例

MOV R1, [[0x1000]] ; R1 = 内存地址(内存地址0x1000处的值)处的数据

不同架构的寻址方式差异

x86

x86:支持复杂寻址(如 [eax + ebx*4 + 0x10])。

ARM

ARM:主要使用基址+偏移或寄存器间接寻址

RISC-V

RISC-V:简化寻址模式(仅支持基址+立即数偏移)。

总结

寻址方式 特点 典型应用场景
立即寻址 操作数在指令中 常量赋值(MOV R1, 5)
寄存器寻址 操作数在寄存器 算术运算(ADD R1, R2)
直接寻址 操作数在固定内存地址 全局变量访问
寄存器间接寻址 操作数地址在寄存器 指针解引用(MOV R1, [R2])
基址/变址寻址 基址 + 偏移量 数组/结构体访问
相对寻址 PC + 偏移量 跳转指令(JMP +0x10)
堆栈寻址 通过SP隐式访问 函数调用(PUSH/POP)
理解寻址方式对编写高效汇编代码和优化程序性能至关重要。


http://www.xdnf.cn/news/2269.html

相关文章:

  • 通过gap看margin和padding在布局中的应用
  • 摩尔投票法详细介绍
  • void指针为何能幻化有数据类型?
  • Linux下的I/O复用技术之epoll
  • Linux:进程间通信->命名管道
  • 【WSL】wsl2出现Exec format error的解决办法
  • 矫平机终极指南:特殊材料处理、工艺链协同与全球供应链管理
  • Java 线程的六种状态与完整生命周期详解
  • YOLOv8改进新路径:Damo-YOLO与Dyhead融合的创新检测策略
  • C语言学习之调试
  • 小白自学python第三天
  • 当高级辅助驾驶遇上“安全驾校”:NVIDIA如何用技术给无人驾驶赋能?
  • Python类和对象四(十三)
  • 2025雅思口语工具Top10:AI软件真实测评
  • 在springboot项目中,如何进行excel表格的导入导出功能?
  • JavaScript基础-算数运算符
  • (四) 实战Trae 编译调试C++项目(以minidocx为例)
  • Winform(2.多线程)
  • C19-while循环及for循环等价引入
  • CANFD技术在实时运动控制系统中的应用:协议解析、性能测试与未来发展趋势
  • (23)VTK C++开发示例 --- 读取所有的PolyData类型示例
  • 网络管理知识点
  • Java----内部类 以及 调用关系
  • Pygame终极项目:从零开发一个完整2D游戏
  • C++之map
  • ngrok 内网穿透技术系统性文档
  • 初始网络流(最小割)
  • 【C语言练习】005. 编写表达式并确定其值
  • leetcode刷题日记——环形链表
  • 新增Webhook通知功能,文档目录树展示性能优化,zyplayer-doc 2.5.1 发布啦!