当我编译这段代码时
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。
mov edi, edi
不是无操作。它的作用是将rdi
的高32位设置为0。mov edi, edi
开头”,而是像“为什么这个 x86-64 汇编代码看起来像一个可热插拔函数”。此外,该代码甚至没有指定 ms_hook_prologue
属性,最新版本的 gcc 不支持 x86-64 的 ms_hook_prologue,似乎在 x86-64 上会使用 leaq [%rsp + 0], %rsp
prologue 而不是 mov edi, edi
(http://tinyurl.com/39fye3w)。我将删除我的答案。 - Alex Jasmin