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中保存的地址。还是属于间接跳转。

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

机器码call和jmp地址的计算的更多相关文章

  1. [20170611]关于数据块地址的计算.txt

    [20170611]关于数据块地址的计算.txt --//如果数据库出现一些问题,会在alert或者跟踪文件,或者屏幕出现一些错误提示.例如: ORA-00600: internal error co ...

  2. JMP地址公式推导

    以上有个问题:为什么同样的汇编指令JMP 12345678却对应不同的机器码呢? 首先,机器码E9表明这是一个近跳转(Near Jmp) 这里需要补充下相关知识: JMP分3种: ①短跳转(Short ...

  3. 使用B或BL跳转时,下一条指令的地址的计算

    .text .global _start 3_start: b step1 step1: ldr pc, =step2 step2: b step2 反汇编代码: : eaffffff b 0x4 : ...

  4. CIDR概述及其地址块计算

    CIDR概述 英文:Classless Inter-Domain Routing,中文是:无分类域间路由选择.一般叫做无分类编址. 设计目的:解决路由表项目过多过大的问题. 表示法:{<网络前缀 ...

  5. 计算机网络关于IP地址的计算问题

    1.某校园网地址是202.100.192.0/18,要把该网络分成30个子网,则子网掩码应该是 (    ). A. 255.255.200.0       B. 255.255.224.0 C. 2 ...

  6. Mach-O在内存中符号表地址、字符串表地址的计算

    KSCrash 是一个用于 iOS 平台的崩溃捕捉框架,最近读了其部分源码,在 KSDynamicLinker 文件中有一个函数,代码如下: /** Get the segment base addr ...

  7. 彻底明白IP地址——IP地址的介绍

    彻底明白IP地址——IP地址的介绍 [ 作者:担子    转贴自:赛迪网    点击数:9692    更新时间:2004-12-22  ]   IP地址的介绍 1.IP地址的表示方法 IP地址 = ...

  8. ASM:《X86汇编语言-从实模式到保护模式》第七章应用例:用adc命令计算1到1000的累加

    在16位的处理器上,做加法的指令是add,但是他每次只能做8位或者16位的加法,除此之外,还有一个带进位的加法指令adc(Add With Carry),他的指令格式和add一样,目的操作数可以是8位 ...

  9. 计算机网络: IP地址,子网掩码,默认网关,DNS服务器详解

    楔子: 以Windows系统中IP地址设置界面为参考(如图1), IP地址, 子网掩码, 默认网关 和 DNS服务器, 这些都是什么意思呢? 学习IP地址的相关知识时还会遇到网络地址,广播地址,子网等 ...

随机推荐

  1. 嵌入式环境下通过 UDP 链接来调试 QT 程序

    据说有为嵌入式提供的 QT Debug 手段,但是目前还没发现,所以想到了这个笨办法.有更好思路的可以推荐. 该思路是基于 QDebug() .因为 QT 提供了重写 QT msg 处理方法的接口 q ...

  2. C# 生成xml文件

    本篇文章旨在.net环境下生成xml文件,以控制台应用程序为例进行说明. 1.在vs中新建控制台应用程序CreateXml 2.CreateXmlFile:主要生成xml的函数 public void ...

  3. ( 译、持续更新 ) JavaScript 上分小技巧(四)

    后续如有内容,本篇将会照常更新并排满15个知识点,以下是其他几篇译文的地址: 第一篇地址:( 译.持续更新 ) JavaScript 上分小技巧(一) 第二篇地址:( 译.持续更新 ) JavaScr ...

  4. python pep8

    有这个自动的规范检查工具 pip install pep8 具体使用不说了 ==. 百度一堆  http://blog.sae.sina.com.cn/archives/4781  看这里

  5. iOS 获得当前经纬度和城市

    1.引入CoreLocation.framework,#import <CoreLocation/CoreLocation.h>,添加委托CLLocationManagerDelegate ...

  6. vc++ 中 IntelliSense: 无法打开 源 文件 "xxx.h"

    类似无法找到文件的问题都可以用这个方法解决,就是路径的问题.vc++2008的项目转到vc++2010也可能出现类似的问题. 解决方法: 在  项目属性=>配置属性=>C/C++  =&g ...

  7. BZOJ2599 [IOI2011]Race

    传送门 点分治,黄学长的选根方法会T掉,换了这个人的选根方法就可以了. 当然,你也可以选择黄学长的奇淫优化 //BZOJ 2599 //by Cydiater //2016.9.23 #include ...

  8. JS-DOM2级封装练习题--点击登录弹出登录对话框

    <!doctype html><html lang="en"> <head> <meta charset="UTF-8" ...

  9. socket传数据并记录到文件中

    最近在新项目中要通过socket传一些数据,下面是程序: 功能: 将客户端发送的json数据写入到日志文件中,如果数据不是json的,丢弃. 程序如下: #!/usr/bin/env python # ...

  10. Apache+php+mysql+SQLyog在windows7下的安装与配置图解

    先准备好软件: Apache官方下载地址:httpd-2.2.25-win32-x86-openssl-0.9.8y.msi,更多版本在这里: php官方下载地址:php-5.4.37-Win32-V ...