当我编译这段代码时

unsigned char A[] = {1, 2, 3, 4};

unsigned int
f (unsigned int x)
{
  return A[x];
}

gcc输出
mov edi, edi
movzx  eax, BYTE PTR A[rdi]
ret

在x86_64机器上。

问题是:为什么要使用nop指令(mov edi,edi)?

我正在使用gcc-4.4.4。

最佳答案

在64位模式下,mov edi, edi不是空操作。它将rdi的高32位设置为0。

这是一般情况的一种特殊情况,在32位操作中,所有32位操作都在64位模式下清除目标寄存器的高32位。 (与保留不变的CPU相比,它可以提供更高的CPU效率,而且也许也更有用。)

关于c - GCC热修补?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4121053/

10-11 16:55