• 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

  • 相关阅读:
    298. Binary Tree Longest Consecutive Sequence
    117. Populating Next Right Pointers in Each Node II
    116. Populating Next Right Pointers in Each Node
    163. Missing Ranges
    336. Palindrome Pairs
    727. Minimum Window Subsequence
    211. Add and Search Word
    年底购物狂欢,移动支付安全不容忽视
    成为程序员前需要做的10件事
    全球首推iOS应用防破解技术!
  • 原文地址:https://www.cnblogs.com/awpatp/p/1923820.html
Copyright © 2020-2023  润新知