zoukankan      html  css  js  c++  java
  • call指令的地址是怎么计算出来的。

    :00401008 E801000000              call 0040100E
    :0040100D C3                      ret

     call 0040100E的机器码是E801000000,E8是CALL指令的opcode,后面的0100 0000是怎么和0040100e对应起来的。

    其实01000000这是一个相对地址,并不是我想象的E8后面根一个绝对地址。 绝对地址=call指令的下条指令的地址+相对地址

    call指令的下条指令的地址是0040100D+ 相对地址 这里是01000000,由于是little end 反过来就是00000001 

    0040100D+00000001=0040100E

    0040100E就是这么来的。

    jz je等条件跳转jmp等条件跳转指令都是这么一个算法

    跳转或者call的绝对地址=call指令或跳转指令的下一条指令的地址+ 相对地址(翻转)

    为什么要用相对地址,而不用绝对地址呢?我想的是重定位的问题,如果机器码中使用了绝对地址,如果这段代码被加载到了别的基址(HMODULE),机器码中的绝对地址就必须要修改,否则就会跳转到错误的地方执行而 如果选择了相对地址,那么就不用修改这个地址,代码会自动跳转到正确的地方执行。

    说到这里,全局变量用的就是绝对地址,所以如果加载到别的基址,就需要重定位,全局变量重定位需要重定位表

  • 相关阅读:
    OAuth2.0说明文档
    CentOS直接解压可用的memcached、nginx、keepalived
    CentOS离线安装GCC编译环境
    [交通安全]电动自行车认定为非机动车的文件
    修改sublime列编辑快捷键
    手机号归属地接口
    ubuntu下typora的gitee图床配置-----基于picgo
    spyder无法切换中文输入法
    lightgbm直方图算法
    xgboost原理分析
  • 原文地址:https://www.cnblogs.com/yfish/p/15392883.html
Copyright © 2011-2022 走看看