MENU

寻址方式 (80x86汇编语言)

August 26, 2019 • 我爱学习

寻址方式 (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]

寻址实例

  1. 下面给出一个交换数据的示例,具体代码如下(基址+偏移量寻址):
    基址+偏移量寻址
  2. 是一个变址寻址的例子:
    变址寻址
Last Modified: September 8, 2021