机器码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地址的相关知识时还会遇到网络地址,广播地址,子网等 ...
随机推荐
- AngularJs angular.Module模块接口配置
angular.Module Angular模块配置接口. 方法: provider(name,providerType); name:服务名称. providerType:创建一个服务的实例的构造函 ...
- js中substring与substr的学习。
今天在工作的过程中,看到js中两个双胞胎函数.分别是substring与substr.顿时被两个可恶的家伙给迷惑住了,不知道具体有什么作用.. 先来看看substring手册是怎么介绍的. 手册解释的 ...
- bootstrap学习总结-01 环境准备
1 下载Bootstrap Bootstrap 是最受欢迎的 HTML.CSS 和 JS 框架,用于开发响应式布局.移动设备优先的 WEB 项目.当前下载的Bootstrap版本为v3.3.7 htt ...
- eclipse配置gradle
1.Grandle官网下载Gradle 2.解压文件,配置到环境变量 3.测试安装成功,$ gradle -v 4.打开eclipse,Help-->Install new software,输 ...
- Docker入门教程(六)另外的15个Docker命令
Docker入门教程(六)另外的15个Docker命令 [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第六篇,继续介绍Docker命令.之前的第二篇文章 ...
- maven的环境搭建
maven环境快速搭建 最近,开发中要用到maven,所以对maven进行了简单的学习. .关于maven是什么东东,请参考其它文章. ----------------准备工作------------ ...
- c++异常捕获
概念: “C++异常”就是 try{}catch(...){} “SEH异常”就是 __try{} __except(-//){} (关于这两种异常,如有不了解的地方,网上有很多资料可以参考) 目前微 ...
- JavaWeb学习笔记——访问静态HTML网页
基础知识: 1.一个标准 的WEB应用,在根目录下必须有一个WEB-INF文件夹,文件夹下必须有一个WEB.xml文件. 2.classes文件夹用来存放编译的class文件. 3.lib文件夹用来存 ...
- javascript 小技巧
1:Boolean()==!! console.log(Boolean(888));//true console.log(!!(888));//true console.log(Boolean(&qu ...
- 一种nodejs的MVC框架
mvc会针对请求进行分发,分发一般有controller(针对模块),action(针对模块中的方法),args(请求的参数). 1.先对http请求的url进行设置,解析url中的各种参数: //c ...