计算所需的最小寻址模式数是多少?

AdH*_*nem 2 x86 assembly cpu-architecture cpu-registers addressing

在x86汇编程序中,假设你有

  • 用于分配号码的立即寻址模式
  • 寄存器寻址模式的寄存器
  • 内存地址的直接寻址模式,

为什么需要索引和基指针寻址模式?据我所知,每个都可以用循环代替.

间接模式似乎也没有太大用处,因为您可以简单地使用直接模式来引用内存地址.首先访问寄存器的目的是什么,然后包含指向存储器地址的指针?

简而言之,哪些寻址方式确实是必要的?

Eld*_*Bug 6

虽然理论上"寻址模式"可用于指代操作数类型,但由于它不涉及地址,因此有点令人困惑.英特尔手册使用"寻址模式"来指代内存寻址,我将使用此定义.

在汇编中,操作数可以是:

  • 直接的价值
  • 一个寄存器
  • 内存中的值(这里的操作数是地址)

在x86架构中,"寻址模式"仅适用于最后一种类型的操作数:存储器操作数(地址),并且指的是可用于计算地址的方法.寻址模式可以在单个可配置寻址模式中汇总:

address = REG_base + REG_index*n + offset
Run Code Online (Sandbox Code Playgroud)

REG_base,REG_index,noffset都是可配置的,都可以省略(但你需要至少一个,很明显).

address = offset被称为立即,直接或绝对寻址.
address = REG_base称为寄存器间接寻址.
address = REG_base + REG_index被称为基础加索引寻址.
同样,您可以添加offset(offset)和scale(n).

严格地说,您只需要一种模式来执行所有操作:注册间接寻址(address = REG).这样,如果需要访问内存,可以在寄存器中计算所需的任何地址,并使用它来进行访问.它也可以通过使用内存替换直接寄存器操作数,并通过使用算术构造值来立即操作数.但是,对于实际的指令集,您仍然可以立即操作数来有效地加载地址,如果您不想要仅指针寄存器,则需要注册操作数.

除了间接寄存器之外的所有其他寻址模式都是为了方便起见,它们确实非常方便:

  • 如果您只需访问内存中的固定变量,立即寻址将为您保存一个寄存器.
  • Base + offset对于访问对象成员非常有用:您可以将基址保存在寄存器中,并访问具有固定偏移量的单个成员.无需中间计算或注册以保存成员地址.
  • 类似地,索引寻址用于访问数组:您只需更改索引寄存器即可访问数组中的任何值.
  • 使用比例,您可以访问多字节变量(ex :) int数组,而无需额外的寄存器或计算.
  • 所有内容的组合可用于访问对象中的数组成员,仍然保留基指针以便可能访问对象中的其他成员.

这些寻址模式不需要CPU的大量计算:只需要添加和移位.考虑到x86可以在每个周期进行乘法,这些操作很简单,但仍然非常方便.