-1

ADD( const, memory)是最混乱的,这个代码序列看起来像下面这样:

  • 从内存中获取指令字节。
  • 更新 EIP 以指向下一个字节。
  • 解码指令。
    • 如果需要,获取一个位移以用于有效地址计算
    • 如果需要,更新 EIP 以指向位移值之外。
  • 从内存中获取常量值并将其发送到 ALU。
  • 更新 EIP 以指向超出常量的值(在内存中的下一条指令处)。
  • 从内存中获取源操作数的值并将其发送到 ALU。
  • 指示 ALU 添加值。
  • 将结果存储回内存操作数。
  • 用加法运算的结果更新标志寄存器。

这是来自汇编语言的艺术书。为什么 EIP 更新了 2 次甚至 3 次?

4

1 回答 1

3

您永远无法观察到 EIP 指向正在解码的指令的中间。这只是作者的注释。真正的硬件显然不会在缓慢的迭代过程中解码,因为它是硬件而不是软件。

x86 的解码很复杂,如果操作码根据操作数大小采用 16 位或 32 位立即数,操作数大小的前缀甚至会改变指令其余部分的长度。英特尔 CPU 在解码时实际上会在此停止。(这称为 LCP 停顿)。

但是,这种表示法听起来很奇怪,因为可变长度操作码意味着指令的长度 + 立即数。解码前缀 + 操作码会告诉您指令的总长度,但寻址模式除外,它可能具有 SIB 字节和/或位移。

于 2016-05-25T21:56:10.593 回答