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