zoukankan      html  css  js  c++  java
  • 机器码call和jmp地址的计算

    call和jmp都是跳转指令,但是call的同时会把pc地址压入堆栈,并且这两种方式都有远和近跳转。下面的分析不全,因为没有在网上找到足够的资料,个人创造这个情景还是有些困难。

    1.例子中的call的机器码为0xe8。

      0x400204ba <+30>:     e8 41 b6 05 00 call   0x4007bb00 <__printf>

      0x400204bf <+35>:     c9     leave  

    问题:0x4007bb00是如何计算得来的?

    pc = 0x400204bf(取完当前指令之后,pc指向下一条语句)

    另一个因为是是在x86机器上,所以是小端,那么下一个32位操作数就是0005b641,

    pc + 操作数 =0x400204bf + 0x0005b641 = 0x4007bb00 

    2.jmp有多种跳转:

    2.1.如果是远跳转,操作数是一个32位数,机器码e9

    0x40011728 <+392>: e9 46 ff ff ff jmp 0x40011673 <_dl_open+211>
    0x4001172d <+397>: 8b bb ec 04 00 00 mov 0x4ec(%ebx),%edi

    计算方式和call(e8)一样,0x4001172d + 0x ffffff46 = 0x40011673 

    2.2.如果是短跳转,操作数8位数,机器码eb

    0x0804850d <+9>: c7 04 24 0a 00 00 00 movl $0xa,(%esp)
    0x08048514 <+16>: e8 1f ff ff ff call 0x8048438 <sleep@plt>
    0x08048519 <+21>: e8 0a ff ff ff call 0x8048428 <myprint@plt>
    0x0804851e <+26>: eb ed jmp 0x804850d <main+9>

    解:pc = 0x8048520

      操作数 = 0xed  

      0x8048520 + 0xed - 0x100 = 0x804850d

    情况2:0x4013b30d <+93>:     eb ee  jmp    0x4013b2fd <*__GI___libc_dlsym+77>

      pc = 0x4013b30f

      操作数 = 0xee

      0x4013b30f + 0xee = 0x4013b3fd

      0x4013b3fd - 0x100 = 0x4013b2fd 

      操作数-0x100就是操作数的补码,最高位是符号位,若为1,则代表负数,若为0 代表正数。需要扩展符号位

      0x4013b30f +0xffffffee = 0x4013b2fd 

    情况3: 0x4013b2d6 <+38>:     75 2b  jne    0x4013b303 <*__GI___libc_dlsym+83>

      0x4013b2d8 + 2b  = 0x4013b303 

    2.3.如果是近跳转,操作数是16位数

      由于没有找到合适的例子,个人觉得和短跳转的计算方式是一样的

    2.4.以上都是相对跳转,还有一种绝对跳转,机器码ff25

    0x08048428 <+0>: ff 25 08 a0 04 08 jmp *0x804a008
    0x0804842e <+6>: 68 10 00 00 00 push $0x10
    0x08048433 <+11>: e9 c0 ff ff ff jmp 0x80483f

    跳转到0x0804a08中保存的地址。还是属于间接跳转。

    其他的跳转方式,等遇到了再补。

  • 相关阅读:
    解决ListView异步加载数据之后不能点击的问题
    android点击实现图片放大缩小 java技术博客
    关于 数据文件自增长 的一点理解
    RAC 实例不能启动 ORA1589 signalled during ALTER DATABASE OPEN
    Linux 超级用户的权利
    RAC 实例 迁移到 单实例 使用导出导入
    Shell 基本语法
    Linux 开机引导与关机过程
    RAC 实例不能启动 ORA1589 signalled during ALTER DATABASE OPEN
    Oracle RAC + Data Guard 环境搭建
  • 原文地址:https://www.cnblogs.com/leo0000/p/5632247.html
Copyright © 2011-2022 走看看