zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    spring cloud教程
    ideaaaaaaaaa
    Django
    Django 基础介绍
    Pychram
    python
    python
    python
    Python
    Python -- Scrapy 命令行工具(command line tools)
  • 原文地址:https://www.cnblogs.com/awpatp/p/1923820.html
Copyright © 2011-2022 走看看