x86 asm上的新手 - mov a,[b + 2]和add b的等价,2 | mov a,[b]

时间:2014-04-09 11:27:09

标签: assembly compiler-construction x86 x86-64

我想知道以下

mov eax, [ebx+4]

相当于

add ebx, 4
mov eax, [ebx]

除了可读性和代码样式问题之外,是否有性能改进或者为什么第一个优先于后者?

1 个答案:

答案 0 :(得分:5)

虽然"等效",但如下所示存在差异,并且有几个理由偏好mov eax,[ebx+4]而不是add, mov

  1. 执行地址计算ebx+4"免费"通过CPU中的地址计算逻辑
  2. 只有一条指令长,两条指令
  3. 它不会导致ALU操作结果与内存负载之间的依赖性停顿(取决于CPU实现)
  4. 保留FLAGS寄存器(条件代码),MOV不会改变EFLAGS而ADD会改变
  5. 内存中的字节数更少
  6. 它不会修改EBX,虽然根据上下文可能不是一件好事,也许你想要更新EBX?
  7. 释放微架构资源,以便其他指令可以与MOV并行执行。现代CPU将在LOAD / STORE执行单元中执行MOV(来自存储器的负载),该执行单元可以执行自己的地址计算,并在FIXED-POINT执行单元中执行ADD ...如果在MOV指令中进行地址计算这释放了一个FIXED-POINT执行单元来并行执行其他操作。