机器码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中保存的地址。还是属于间接跳转。
其他的跳转方式,等遇到了再补。
机器码call和jmp地址的计算的更多相关文章
- [20170611]关于数据块地址的计算.txt
[20170611]关于数据块地址的计算.txt --//如果数据库出现一些问题,会在alert或者跟踪文件,或者屏幕出现一些错误提示.例如: ORA-00600: internal error co ...
- JMP地址公式推导
以上有个问题:为什么同样的汇编指令JMP 12345678却对应不同的机器码呢? 首先,机器码E9表明这是一个近跳转(Near Jmp) 这里需要补充下相关知识: JMP分3种: ①短跳转(Short ...
- 使用B或BL跳转时,下一条指令的地址的计算
.text .global _start 3_start: b step1 step1: ldr pc, =step2 step2: b step2 反汇编代码: : eaffffff b 0x4 : ...
- CIDR概述及其地址块计算
CIDR概述 英文:Classless Inter-Domain Routing,中文是:无分类域间路由选择.一般叫做无分类编址. 设计目的:解决路由表项目过多过大的问题. 表示法:{<网络前缀 ...
- 计算机网络关于IP地址的计算问题
1.某校园网地址是202.100.192.0/18,要把该网络分成30个子网,则子网掩码应该是 ( ). A. 255.255.200.0 B. 255.255.224.0 C. 2 ...
- Mach-O在内存中符号表地址、字符串表地址的计算
KSCrash 是一个用于 iOS 平台的崩溃捕捉框架,最近读了其部分源码,在 KSDynamicLinker 文件中有一个函数,代码如下: /** Get the segment base addr ...
- 彻底明白IP地址——IP地址的介绍
彻底明白IP地址——IP地址的介绍 [ 作者:担子 转贴自:赛迪网 点击数:9692 更新时间:2004-12-22 ] IP地址的介绍 1.IP地址的表示方法 IP地址 = ...
- ASM:《X86汇编语言-从实模式到保护模式》第七章应用例:用adc命令计算1到1000的累加
在16位的处理器上,做加法的指令是add,但是他每次只能做8位或者16位的加法,除此之外,还有一个带进位的加法指令adc(Add With Carry),他的指令格式和add一样,目的操作数可以是8位 ...
- 计算机网络: IP地址,子网掩码,默认网关,DNS服务器详解
楔子: 以Windows系统中IP地址设置界面为参考(如图1), IP地址, 子网掩码, 默认网关 和 DNS服务器, 这些都是什么意思呢? 学习IP地址的相关知识时还会遇到网络地址,广播地址,子网等 ...
随机推荐
- wordpress /wp-content/plugins/wp-symposium/server/php/UploadHandler.php File Arbitrary Upload Vul
catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 Relevant Link:2. 漏洞触发条件3. 漏洞影响范围4. 漏 ...
- Objective-C 利用OC的消息机制,使用Method Swizzling进行方法修改
功能:修改父类不可修改函数方法,函数方法交换 应用场景:假如我们使用的他人提供一个的framework,.m已被打包成二进制.a无法修改源码,只留下.h头文件,那假如代码中某个函数出现了问题可以通过这 ...
- iOS应用第三方推送的添加
现在的一些第三方的推送平台挺好用,主要是因为他们有类似微信公众平台一样的管理后台,简单易用,封装了很多开发者需要的推送功能. 下面以个推为例: 1.在个推的应用配置iOS部分设置自己的BounleID ...
- [JAVA 多种方式读取文件]
package com.file; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream ...
- Java 中常用缓存Cache机制的实现
所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例.这样做可以减少系统开销,提高系统效率. 所谓缓存,就是将程序或系统经常要调用的对象存在内存中 ...
- zabbix 3.0快速安装简介(centos 6)
zabbix快速安装 系统版本:centos 6 1.yum源配置和zabbix.msyql安装 rpm -ivh http://mirrors.aliyun.com/zabbix/zabbix/3. ...
- centos 搭建git服务器
centos 6搭建git服务器 安装 rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-6.noarch.rpm yum ins ...
- Objective-C学习笔记类目、协议
不是所有的方法都可以被覆盖的!比如:intValue就不能被覆盖!! 原因正在查找中! 别人的电脑上却可以! 类目.h件 #import <Foundation/Foundation.h> ...
- win 2012 修改盘符
开始--运行 diskmgmt.msc ........
- 查询centos查看系统内核版本,系统版本,32位还是64位
[root@centos01 ~]# lsb_release -a #查看centos 版本为6.4LSB Version: :base-4.0-amd64:base-4.0-no ...