jmp连mysql_令人迷惑的ATT的jmp:直接跳转和间接跳转 [转]

最近看链接器源码中,对位置无关代码PIC(共享库)的链接问题,发现对call和jmp很多不常用的用法,这里试验并总结了一下各种用法。

我们最常用的jmp形式,就是 jmp后面跟个标签!这个没什么可说的!

假如标签叫做mylabel,它的地址是0x8048377,而且有个全局变量b,b存储的内容就是mylabel的地址,而b的地址是0x80494A8。

即有这样的赋值(加载)语句:

movl$mylabel,%eax//把mylabel的地址加载到eax寄存器中

movl%eax,b//把mylabel的地址加载到b中

movl$b,%ebx//把b的地址加载到ebx寄存器中

我们考虑下面的语句:

1.jmpmylable

2.jmp0x8048377

3.jmp%eax

4.jmp*%eax

5.jmp*(%ebx)

6.jmp*0x80494A8

7.jmp*b

8.jmp$0x5

这7句jmp语句!分别都做了什么?

1.不用说,跳转到mylabel标签处继续执行代码,但是,是如何跳转的呢?就是PC加上了mylabel标签处对于jmp处的一个偏移地址!可执行的二进制代码是这样表示的:eb 03,就是说,pc+0x03就可以了。

2.这里,0x8048377是mylabel的地址,我以前研究过,标签的作用,更他的地址的作用是等效的。所以,这里的执行效果跟1中的相同。但是,还有些不一样!这里的二进制代码成了:e9 03 00 00 00 这里用了32位表示了这个偏移,而在1中,只用了8位!

3.在编译链接的时候,这句代码会有警告:warning:indirect jmp without '*'。间接跳转没有‘*’符号,但是,执行起来,还是没有错。看一下二进制的可执行文件的代码,发现,给补上了个‘*’号!而且二进制是:ff e0.

4.其实,4是3的补充版,正常的形式就是4,而三是有警告的被补充的版本。

5.%ebx是b的地址,那么(%ebx)表示ebx的值为地址,指向的地方。这里指向了b的内容,也就是mylabel的地址!于是,化简后,5也就等效与2,但是,二进制表示是:ff 23。

6.0x80494A8是b的地址,这里看做内存数,那么实质上,b指向的值是mylabel的地址,于是,化简后同2,二进制代码是:ff 25 a8 94 04 08。

7.b是标签,代表一个地址,所以,这里同6,二进制代码也同6

8.这句话是错误的,jmp不支持立即数!

所以说,正确的写法有:

1.jmpmylable//eb 03

2.jmp0x8048377//e9 03 00 00 00

3.jmp*%eax//ff e0

4.jmp*(%ebx)//ff 23

5.jmp*0x80494A8//ff 25 a8 94 04 08

6.jmp*b//ff 25 a8 94 04 08

1和2叫做间接寻址,就是算偏移量的。后面没有‘*’号,而是直接一个标签或者地址(标签就可以看做是地址),所以说,就是一个直接的地址的值。间接跳转的二进制代码是eb或者e9,是e开头的。

3,4,5,6叫做直接寻址,直接寻址的标识就是这个‘*’号!直接寻址,就是PC直接赋值某个地址,而不是加偏移量。所以,‘*’号后面的部分,其实是一个要付给PC的值,那么,取值的方式就好想象了!直接跳转的二进制代码是ff开头的。

3是寄存器直接取值;4是寄存器间接取值;5是内存数取值;6是标签取值(实质上同5)。

确实,有点意思~

call同jmp指令!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

区分关联、依赖和聚集关系

在建立对象模型时,很容易把依赖、关联和聚集关系混淆。当对象A和对象B之间存在依赖、关联或聚集关系时,对象A都有可能调用对象B的方法,这是三种关系之间的相同之处,除此之外,它们有着不同的特征。 1.依赖关…

MarkDown 语法手册

From: https://blog.csdn.net/witnessai1/article/details/52551362 From: http://www.jianshu.com/p/1e402922ee32/ 菜鸟教程:Markdown 教程:https://www.runoob.com/markdown/md-tutorial.html Markdown 语法手册:https://www.zybuluo.com…

硬件安全(1)—— SHA-1算法在FPGA上的实现-2

SHA-1算法在FPGA上的实现-2 在上一篇文章中&#xff0c;我详细介绍了SHA-1算法的计算过程。SHA-1算法主要由消息填充(Message Padding)和哈希计算(Hash Function Engine)两部分组成。消息块标准长度规定为512bits一组。消息填充在实现过程中需要区分长度不足一个消息块( < …

Mysql -uroot -p 登陆不上_mysql的登陆和退出命令格式

mysql登陆的命令格式为&#xff1a;mysql -h [hostip] -u [username] -p [password] [database]1.普通登陆mysql数据库命令格式&#xff1a;mysql -u 用户名 -p 密码&#xff0c;例如: mysql -u root -p root如果在-p后没有提供密码&#xff0c;则会在执行命令后要求用户输入密…

Java加密与解密的艺术~RSA实现

RSA 实现 /*** 2008-6-11*/ package org.zlex.chapter08_2;import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import …

Eclipse Ant组件出现unable to find a javac compiler的解决方法

解决方法是在一个外国人的blog上看来的&#xff0c;记到我的博客方便大家搜索&#xff0c;呵呵。该作者解释原因是Ant不能和JRE一起使用&#xff0c;而需要使用JDK来作为Runtime JRE, 但是这个原因似乎也不是真正的原因&#xff0c;只是这个方法可以解决问题&#xff0c;解决方…

IBM发布未来五年五大科技预测

来源&#xff1a;人工智能和大数据未来五年五大科技预测之AI偏见&#xff1a;AI 偏见将会爆发。但只有公正的 AI 才能生存。 5年之内&#xff0c;有偏见的AI系统和算法将不断增多&#xff0c;就像早前的计算机病毒增多一样。但我们将采取相应的应对措施&#xff0c;提出新的解决…

今天开始学OpenWRT - 21/03/8

背景简介 OpenWRT是一个运行在嵌入式设备上的Linux操作系统。相较于之前简单的、固化的路由器系统&#xff0c;OpenWRT提供了一个完整的可编写的文件系统&#xff0c;包括安装包管理。这使用户从供应商提供的应用程序选择和配置中解放出来&#xff0c;并允许用户通过使用软件包…

mysql root mysqld_MySQL how to run mysqld as root

场景版本5.6.44&#xff0c;[ERROR] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!此处 mysql是出于安全考虑&#xff0c;默认拒绝用root账号启动mysql服务。解决1.通过在命令后面加上--userroot 进行强制使用…

seekg()与tellg()相关文件操作

From: http://www.cnblogs.com/kex1n/archive/2011/01/28/2286423.html 对输入流操作&#xff1a;seekg&#xff08;&#xff09;与tellg&#xff08;&#xff09; 对输出流操作&#xff1a;seekp&#xff08;&#xff09;与tellp&#xff08;&#xff09; 下面以输入流函数为例…

asp.net三层架构详解

一、数据库 /**//*DBMS name: Microsoft SQL Server 2000 *//**/if exists (select 1from sysobjectswhere id object_id(newsContent)and type U)drop table newsContentgo/**//*Table: newsContent …

在Linux环境下使用C语言倒转字符串,输出错误的解决办法

项目场景&#xff1a; 学习在Linux环境下的C语言编程&#xff0c;利用GDB打Breakpoint&#xff0c;逐步调试Bug 问题描述 尝试将一个字符串倒转后输出&#xff0c;发现执行文件并没有正常的将倒转后的字符串输出。 源代码&#xff1a; #include <stdio.h>int main(voi…

“机器人之夜”看猎豹跑得快还是五款机器人价格降得快?“鸿门宴”正式上演

来源&#xff1a;机器人大讲堂3 月 21 日&#xff0c;猎豹移动&#xff08;NYSE: CMCM&#xff09;联合旗下人工智能公司猎户星空在北京水立方举行“猎豹3.21机器人之夜”发布会&#xff0c;发布自主研发的猎户机器人平台Orion OS&#xff0c;并推出五款全系列机器人产品&#…

mysql sysbench_详解MySQL基准测试和sysbench工具

一、基准测试简介1、什么是基准测试数据库的基准测试是对数据库的性能指标进行定量的、可复现的、可对比的测试。基准测试与压力测试基准测试可以理解为针对系统的一种压力测试。但基准测试不关心业务逻辑&#xff0c;更加简单、直接、易于测试&#xff0c;数据可以由工具生成&…

windows 堆栈溢出简易测试代码

环境&#xff1a;windows xp sp2 vc 6.0 Code1#include <stdio.h> 2 3int fun2() 4{ 5 printf("-------------Get privilege!---------\n"); 6 getchar(); 7 return 0; 8} 910int fun1()11{12 int iRet 0;13 int *pRet &iRet;14 pRet…

数字电路中的Single-Bit跨时钟域设计

数字电路中的Single-Bit跨时钟域设计同步时钟&异步时钟的定义Metastable&#xff08;亚稳态&#xff09;Metastable的产生原因Setup / Hold Requirement的真正原因Metastable造成的问题跨时钟域同步设计跨时钟域处理目标Single-bit的Clock Domin Crossing (CDC) 电路Single…

《Nature》重磅 | 研究员利用机器学习发现近 6000 种未知病毒

作者&#xff1a;李雨晨《Nature》杂志近日发布消息称&#xff0c;研究人员利用人工智能发现了近6000种未知的病毒。这项工作是在3月15日由美国能源部(DOE)组织的一次会议上提出的&#xff0c;它展示了一种探索地球上巨大而未知的病毒多样性的新工具。从人类健康到垃圾降解&…

mysql limit to hosts matching_MySQL 用户访问限制 -- Host Match Limit

笔者前几日在做数据库迁移的时候&#xff0c;发现了一个挺有意思的小东西&#xff1a;数据库访问限制(Host Match limit),简单地翻阅了下给官方资料&#xff0c;发现这个东西应用场景其实非常广泛&#xff0c;只是我们采用了其他可能没有原生数据库带的Access Limit 功能好地方…

Java加密与解密的艺术~SM4实现

国产SM4加密解密算法概念介绍 SMS4算法是在国内广泛使用的WAPI无线网络标准中使用的加密算法&#xff0c;是一种32轮的迭代非平衡Feistel结构的分组加密算法&#xff0c;其密钥长度和分组长度均为128。SMS4算法的加解密过程中使用的算法是完全相同的&#xff0c;唯一不同点在于…

英语连接词2

表示附加的词:additionally, as well as, just as, again, along with, also, further, furthermore, likewise, in the same manner, in the same way, in addition to,引出例子:for example, namely, for instance, as an example, that is表示转折:although, instead, rathe…