• Move EDI, EDI的作用


    玩WinDBG的时候, 发现函数的反汇编代码的最开始部分总是包含一条move edi, edi的指令. 比如下面的代码

    static unsigned int __stdcall Fibonacci_stdcall(unsigned int n)
    {
        switch(n)
        {
            case 0: STOP_ON_DEBUGGER;return 0;
            case 1: return 1;
            default: return Fibonacci_stdcall(n-1)+Fibonacci_stdcall(n-2);
        }
    }

    生成汇编代码的开头部分如下:

    image

    Push EBP和Mov EBP, ESP两条指令是标准的栈框架建立的指令, 但是Mov EDI, EDI是做什么的呢? 看起来它就是两个字节的NOP指令.

    正解:

    mov edi, edi的确是个双字节的no-op指令, 它存在的目的是使得hot-patching称为可能. 它使得对一个函数的hot-fix得以生效且不需要重启机器, 甚至是正在运行中的应用程序也不需要重启. 不重启是通过在运行时将这个2字节的NOP指令替换为一个short jump指令, 这个short jump会使程序跳转到另一个long jump指令处, 而这个long jump指令会使得程序的执行跳转到hotfix的函数处. 这里需要2-byte的指令, 这样, 在patch应用程序的时候指针就不会指向某个函数的中间部分了.

    参考资料

    ==========

    Why does the compiler generate a MOV EDI, EDI instruction at the beginning of functions?

    http://blogs.msdn.com/b/ishai/archive/2004/06/24/165143.aspx

  • 相关阅读:
    第一章ASP.NET SignalR简介
    第六章SignalR的服务器广播
    第五章SignalR的实时高频通讯
    第四章SignalR自托管主机
    第三章SignalR在线聊天例子
    第二章SignalR所支持的平台
    DevExpress ASPxHtmlEditor控件格式化并导出Word (修复中文字体导出丢失)
    改进的简单Tooltips显示
    C# WebForm 使用NPOI 2 生成简单的word文档(.docx)
    一些自用的小工具,分享给非程序猿们
  • 原文地址:https://www.cnblogs.com/awpatp/p/1923820.html
Copyright © 2020-2023  润新知