寻址方式 (8086汇编语言)
为了方便表达,在这里我凭我自己的理解,将寻址方式与C语言的指针类比。
间接寻址
movl (%ecx),%eax
- 使用方式:将寄存器用括号括起来,作为地址使用。
- 意为将括号中的寄存器ecx中存储的数据当做内存地址。相当于C语言的指针。
基址+偏移量 寻址
movl 8(%ecx),%eax
- 使用方式:在间接寻址的基础上在括号前加一个常数,表示偏移量。
- 意为将寄存器ecx中存储的值额外加上一个常数 (例子中是加上8) ,加出来的和作为内存地址。
- 注:常数前不要加
$
符号,加上表示一个常量而不是一个地址
变址寻址
D(Rb,Ri,S) Mem[Reg[Rb]+S*Reg[Si]+D]
其中:
- D:常量(地址偏移量)
- Rb:基址寄存器:8个通用寄存器之一
- Ri:索引寄存器:
%esp
不做索引寄存器,一般%ebp
也不做这个用途。 - S:比例因子 1,2,4,or 8
可以通俗地将这个寻址过程理解为: 类似于C语言通过指针访问数组,首先通过基址加偏移量 (Rb+D) 得到数组的地址,然后再加上数组下标(即索引)乘上数据类型的宽度 ((Rb+D)+S*Ri) ,即可得到数组中下标为
Ri
处的数据其他变形:(四个要素不一定全部出现)
(Rb+Ri) --- Mem[Reg[Rb] + Reg[Ri]]
D(Rb+Ri) --- Mem[Reg[Rb] + Reg[Ri]+D]
(Rb+Ri,S) --- Mem[Reg[Rb] + Reg[Ri]*S]
寻址实例
- 下面给出一个交换数据的示例,具体代码如下(基址+偏移量寻址):
- 是一个变址寻址的例子: