有人知道“mov edi,edi”是做啥的吗?

Posted

技术标签:

【中文标题】有人知道“mov edi,edi”是做啥的吗?【英文标题】:Anyone knows what "mov edi,edi " does?有人知道“mov edi,edi”是做什么的吗? 【发布时间】:2010-09-16 15:24:51 【问题描述】:
69A8AB13  int         3    
69A8AB14  int         3    
69A8AB15  mov         edi,edi 
69A8AB17  push        ebp  
69A8AB18  mov         ebp,esp 

mov edi,edi 对我来说没有意义,它有什么用?

【问题讨论】:

另见Why do Windows functions all begin with a pointless MOV EDI, EDI instruction? What is the purpose of 'mov edi, edi'? 的跨站点复制。包括 Raymond Chen 关于它的博客文章的链接:blogs.msdn.com/b/oldnewthing/archive/2011/09/21/10214405.aspx 【参考方案1】:

这是一个 2 字节的 NOP 指令。它被包含在使用 /hotpatch 选项编译的映像中的任何函数的开头:

http://msdn.microsoft.com/en-us/library/ms173507.aspx

-斯科特

【讨论】:

NOP 代表“无操作”,这意味着它实际上什么都不做。 @COMer,如果您阅读了@snoone 提供的链接,您就会知道。 这是一个“无操作”,换句话说它根本不做任何事情。它只是在函数的开头提供了一些空间,以便 O/S 中的热补丁支持有一些地方可以放置一个 Detours 样式的钩子。两个字节实际上只够短的相对跳转的空间,所以在函数之前也添加了一些空间(钩子会短跳转到执行长跳转的函数之前的位置)。 这是一个非常低效的 NOP 选择;他们为什么不使用真正的 NOP 的66 90 @PeterCordes:它特别(显然)是一种确保实时修补正在运行的可执行文件永远不会出错并且永远不会实时修补有用指令的方法。【参考方案2】:

根据本页:StackExchange's Reverse Engineering

在 x86-64 mov edi 中,edi 不是 NOP。在 x86-64 中,它会将 rdi 的前 32 位归零。

我虽然指出这一点很重要,但作为 snoone 的回答的补充。

【讨论】:

以上是关于有人知道“mov edi,edi”是做啥的吗?的主要内容,如果未能解决你的问题,请参考以下文章

CSS:这个星号 (*) 是做啥的?

有了解华云数据是做啥的吗?

热补丁:为什么Windows API都以无意义的 mov edi,edi 开头?

Perl 的“祝福”到底是做啥的?

这个解压包是做啥的?有人可以帮我理解几个字母吗?

glStencilMask() 到底是做啥的? [复制]