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

use*_*783 1 compiler-construction x86 assembly x86-64

我想知道以下情况

mov eax, [ebx+4]
Run Code Online (Sandbox Code Playgroud)

相当于

add ebx, 4
mov eax, [ebx]
Run Code Online (Sandbox Code Playgroud)

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

amd*_*mdn 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执行单元来并行执行其他操作.