Windows32 API:函数入口上的"mov edi,edi"?

Ira*_*ter 2 windows seh calling-convention

我正在逐步完成Windows 7中的结构化错误处理恢复代码(例如,在SEH处理程序完成后会发生什么并传回"CONTINUE"代码).这是一个叫做的函数:

 7783BD9F  mov         edi,edi  
 7783BDA1  push        ebp 
 7783BDA2  mov         ebp,esp   
 7783BDA4  push        1  
 7783BDA6  push        dword ptr [ebp+0Ch]  
 7783BDA9  push        dword ptr [ebp+8]  
 7783BDAC  call        778692DF  
 7783BDB1  pop         ebp  
 7783BDB2  ret         8  
Run Code Online (Sandbox Code Playgroud)

我已经习惯了"push ebp/mov ebp,esp"的功能序言."mov edi,edi"的目的是什么?

Ben*_*igt 7

Raymond Chen(微软开发人员之一)回答了这个问题:

他甚至更早地提到了一个参考:

基本上,它为热修补期间插入的跳转指令留出空间.

  • @IraBaxter:代码中没有使用跳转指令的原因也在注释中描述 - 因为它会导致某些处理器上的管道刷新,因此会严重影响性能.提出了跨越缓存边界的2个字节的点,以及它不是问题的原因:链接器ALIGN选项. (2认同)