80x86汇编语言寻址方式汇总
文章目录
寻址方式
1. 寄存器寻址 (Register Addressing)
- 操作数直接存储在一个寄存器中。
- 寄存器寻址是最快的寻址方式,因为它不需要访问内存。
- 寄存器有限,不能存储大量的数据。
mov eax, ebx ; 将 ebx 中的值复制到 eax 中
2. 立即数寻址 (Immediate Addressing)
- 操作数是一个立即数,直接存储在指令中。
- 立即数通常用于存储常量或者小的整数值。
mov eax, 10 ; 将立即数 10 复制到 eax 中
3. 直接寻址 (Direct Addressing)
- 操作数的地址直接给出。
- 直接寻址的速度通常比较快,因为它可以直接访问内存。
- 需要注意地址是否合法,避免访问未分配的内存区域。
mov eax, DS :[0x12345678] ; 将地址 0x12345678 处的值复制到 eax 中
4. 寄存器间接寻址 (Register Indirect Addressing)
- 操作数的地址存储在一个寄存器中。
- 寄存器间接寻址常用于访问数据结构中的元素或者循环中的数组元素。
- 需要确保寄存器中存储的地址是有效的内存地址。
mov ebx, 0x12345678 ; 将地址 0x12345678 存储到 ebx 中
mov eax, [ebx] ; 将 ebx 中存储的地址处的值复制到 eax 中
5. 基址寻址 (Base Addressing)
- 操作数的地址由一个基址寄存器和一个偏移量计算得到。
- 基址寻址常用于访问数据结构中的字段或者数组的元素。
- 确保偏移量不会超出合法范围,避免访问非法内存。
mov eax, [ebx + 10] ; 将 ebx 中存储的地址加上偏移量 10 处的值复制到 eax 中
6. 比例基址寻址/基址变址寻址 (Scaled Index Addressing/Based Indexed Addressing)
- 操作数的地址由一个基址寄存器、一个可选的索引寄存器和一个比例因子组合而成。
- 基址变址寻址通常用于访问多维数组或者数据结构中的复杂字段。
- 确保所有寄存器中存储的地址和索引都是有效的,避免访问非法内存
mov eax, [ebx + esi*4] ; 将 ebx 中存储的地址加上 esi 乘以 4 的偏移量处的值复制到 eax 中
mov eax, 12h[ebx][edi] ; 将 ebx 中存储的地址加上 edi 乘以 1 (未注明默认为1)的偏移量处的值复制到 eax 中
寻址注意事项
1.寄存器间接寻址时:
- 寄存器可用 8个32位通用寄存器(EAX,EBX,ECX,EDX,EDI,ESI,EBP,ESP)
- 可用4个16位通用寄存器(BX,DI,SI,BP)
- 8位通用寄存器不可用
- 选择BP,EBP,ESP时默认采用堆栈段(SS),其余情况采用数据段(DS)
2.变址寻址
- 变址寄存器位16位寄存器或ESP时,比例因子必须为 1 且省略
- 当位移量 V 中存在变量或标号名时,如未指明段寄存器则使用该变量或标号所在的段
- 其余规定与 1 相同
3.基址变址寻址
-
当使用16位寄存器时,基址寄存器只能选用 BX,BP 之一,变址寄存器只能选用 SI,DI 之一
-
当使用16位寄存器时比例因子只能为1
-
当基址寄存器为 BX 时,默认段寄存器为 DS ,当为 BP 时,默认段寄存器为 SS
-
当使用32位寄存器时,变址寄存器不可选用ESP,其他无限制
-
寻址表达式中,未带比例因子的为基址寄存器,若比例因子为1省略,则前面的为基址寄存器
-
基址寄存器为 ESP,EBP 时,默认段寄存器为 SS
4.立即寻址
- 立即寻址只能用于源操作数
- 目的操作数如未表明数据类型(一般非寄存器寻址都没有明确的类型),则需要用 PTR 算符来声明数据类型
5.直接寻址
- 需要在偏移地址前加上要访问的段名
- 一些情况下可以省略段名,见下6.2表
6.其他注意事项
1.各种寻址方式之间的关系
上述6种寻址方式可以归位 3大类 ,即 寄存器方式,存储器方式,立即方式,其中寄存器方式即寄存器寻址,立即方式即立即寻址,其余均为存储器方式,双操作数指令中源操作数和目的操作数必须是以下几种组合:
源操作数 | 目的操作数 |
---|---|
寄存器 | 寄存器 |
寄存器 | 存储器 |
存储器 | 寄存器 |
立即方式 | 寄存器 |
立即方式 | 存储器 |
2.段选择说明
段寄存器在不指明的情况下有缺省值,也可以通过显示说明来指出,下表中的做法选择段寄存器的优先级递增
汇编代码 | 段选择说明 |
---|---|
MOV AX, [SI] | SI 决定段寄存器缺省值为 DS |
MOV AX, [BP+SI] | BP (基址寄存器)决定段寄存器使用 SS |
MOV AX, SUM[BP+SI] | SUM (变量)决定段寄存器使用 DS |
MOV AX, CS: SUM[BP+SI] | 段超越前缀 CS 决定段寄存器使用 CS |