汇编语言常用寻址方式详解
专为编程小白设计 • 大白话讲解 • 一看就懂
寻址方式就是CPU寻找操作数(数据)的方式,相当于你如何在房间里找到想要的东西
1
立即寻址
数据直接写在指令里,CPU执行指令时直接从指令中获取数据。
🧾 就像老师上课时直接说:”请把5写在作业本上”,这个”5″就是立即数。
特点:
- 速度最快,因为数据就在指令中
- 只能用于源操作数(不能直接修改指令中的内容)
- 通常用于初始化寄存器或内存
汇编示例:
MOV AX, 1234H ; 把16进制数1234H放入AX寄存器
MOV BL, 42 ; 把十进制数42放入BL寄存器
MOV BL, 42 ; 把十进制数42放入BL寄存器
2
寄存器寻址
操作数是CPU内部的寄存器,指令直接使用寄存器中的数据。
💼 就像你直接从钱包里拿钱付款,钱包就是寄存器。
特点:
- 速度很快,因为数据就在CPU内部
- 使用频率最高
- 操作数是指定的寄存器名
汇编示例:
MOV AX, BX ; 把BX寄存器的值复制到AX
ADD CX, DX ; 把DX的值加到CX上
ADD CX, DX ; 把DX的值加到CX上
3
直接寻址
操作数在内存中,指令中直接给出内存地址。
📬 就像快递员按照你给的完整地址(如”朝阳区幸福路123号”)送货。
特点:
- 访问内存,速度比寄存器慢
- 地址写在方括号[]内
- 需要明确的地址值
汇编示例:
MOV AX, [1234H] ; 把内存地址1234H处的值读入AX
MOV [5678H], BL ; 把BL的值写入内存地址5678H处
MOV [5678H], BL ; 把BL的值写入内存地址5678H处
4
寄存器间接寻址
操作数的地址存放在寄存器中,通过寄存器找到内存位置。
🔑 就像你找到管家问:”老王把钥匙放哪了?”管家告诉你钥匙的位置。
特点:
- 比直接寻址灵活
- 可以方便地遍历数组
- 常用于指针操作
汇编示例:
MOV BX, 1234H ; 先把地址放入BX
MOV AX, [BX] ; 读取BX指定地址的内容到AX
MOV [SI], DL ; 把DL的值写入SI寄存器指定的地址
MOV AX, [BX] ; 读取BX指定地址的内容到AX
MOV [SI], DL ; 把DL的值写入SI寄存器指定的地址
5
寄存器相对寻址
寄存器中的地址加上一个固定偏移量形成最终地址。
📍 就像你说:”从老王家的地址往前走200米的那家店”。
特点:
- 非常适合访问数组或结构体成员
- 偏移量可以是常量
- 非常常用
汇编示例:
MOV AX, [BX+10] ; 读取BX地址+10字节处的值
MOV [SI-5], CL ; 把CL的值写入SI地址-5字节处
MOV DI, [BP+8] ; 读取BP地址+8字节处的值到DI
MOV [SI-5], CL ; 把CL的值写入SI地址-5字节处
MOV DI, [BP+8] ; 读取BP地址+8字节处的值到DI
6
基址变址寻址
使用一个基址寄存器加上一个变址寄存器形成内存地址。
️ 就像在地图上定位:(城市坐标) + (街道偏移) = 精确位置。
特点:
- 适合二维数组访问
- 基址寄存器通常是BX或BP
- 变址寄存器通常是SI或DI
汇编示例:
MOV AX, [BX+SI] ; 地址 = BX的值 + SI的值
MOV [BP+DI], CX ; 把CX的值写入BP+DI指定的地址
ADD DX, [BX][DI] ; 另一种写法,等同于[BX+DI]
MOV [BP+DI], CX ; 把CX的值写入BP+DI指定的地址
ADD DX, [BX][DI] ; 另一种写法,等同于[BX+DI]
寻址方式对比表
寻址方式 | 速度 | 灵活性 | 典型用途 | 操作数位置 |
---|---|---|---|---|
立即寻址 | 最快 | 低(固定值) | 初始化、赋值 | 指令内部 |
寄存器寻址 | 非常快 | 中 | 中间计算 | CPU寄存器 |
直接寻址 | 较慢 | 低(固定地址) | 访问特定内存变量 | 内存 |
寄存器间接寻址 | 较慢 | 高 | 指针操作 | 内存 |
寄存器相对寻址 | 较慢 | 高 | 数组、结构体访问 | 内存 |
基址变址寻址 | 较慢 | 很高 | 二维数组、复杂结构 | 内存 |
💡 学习建议:
1. 从寄存器寻址开始练习,这是最基础的方式
2. 理解不同寻址方式就像学习不同的”查找数据的方法”
3. 多在汇编调试器中观察地址变化
4. 实际写代码时,寄存器相对和基址变址使用频率很高