jmp指令

2.1.3 汇编调用C函数 一个64位操作系统的实现 阅读详情
最近看链接器源码中,对位置无关代码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. jmp mylable
2. jmp 0x8048377
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. jmp mylable //eb 03
2. jmp 0x8048377 //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指令!
C语言中如何实现同一项目中的快速跳转——goto语句与jmp语句的使用 C语言中如何实现同一项目中的快速跳转goto语句与jmp语句goto语句与jmp语句的相同点goto语句与jmp语句的不同点(附使用方法)goto语句只能够实现同一函数下的跳转jmp语句能够实现不同函数间的跳转而事实上,jmp语句还拥有更加强大的功能:能够实现同一项目中不同源文件间的跳转除此之外(问题)有关extern的使用有关longjmp的使用 goto语句与jmp语句 goto语句与jmp语句的相同点 两者都能够实现快速跳转,而事实上,尽管这种快速跳转极可能导致语句逻辑混乱,既不容易理解,也不方便调试 阅读详情

相关推荐

汇编语言指令 jmp:jmp short、jmp near ptr、jmp far ptr

jmp short 是段内短转移指令,只修改IP的值,其机器码有2个字节,低8位是用于表示jmp的段内短转移指令的指令编码,高8位是用补码形式表示的位移信息,转移的范围:-128 ~ 127。jmp near ptr 是段内近转移指令,只修改IP的值,其机器码有3个字节,低8位是用于表示jmp的段内近转移指令的指令编码,高16位是用补码形式表示的位移信息,转移的范围:-32768~ 32767。jmp far ptr 是根据目的地址进行转移的段间转移指令(又称为远转移指令),可以同时修改CS和IP。

天道酬勤 4686

AT&T汇编学习总结-1

通用寄存器:当处理器处理数据时,通用寄存器用于临时存放数据。 EAX:用于操作数和结果数据的累加器 EBX:指向数据内存段中的数据的指针 ECX:字符串和循环操作的计数器 EDX:I/O指针 EDI:用于字符串操作的目标的数据指针 ESI:用于字符串操作的源的数据指针 ESP:堆栈指针 EBP:堆栈数据指针

2puT 671

汇编学习--jmp指令

jmp reg  IP=(reg);jmp short 标号:IP=IP+8位位移(CPU在执行jmp指令时,并不知道跳转的地址。它只是计算是相对位移)jmp near ptr 标号:IP = IP+16位位移jmp far ptr 标号:段间转移 又称远转移                   (CS)=标号所在段的段地址;(IP)=标号所在段中的偏移地址jmp word p

QQIANQQ的专栏 2393

汇编代码入门 AT&T指令格式

计算机系统结构 博文末尾支持二维码赞赏哦_ cpu内部:                1. PC Program Counter 指令指针寄存器 指向下一条指令的地址 EIP(X86-32)或者 RIP(X86-64) 2. 寄存器与寄存器堆   Registers 在处理器CPU内部以名字来访问的快速存储单元 3. 条件状态码    Condition C...

万有文的博客 1万+

极智量化平台实战:5分钟教你用Python实现双均线交易策略(附完整代码)

本文详细介绍了如何在极智量化平台上使用Python实现双均线交易策略,包括数据获取、信号生成、回测分析和策略优化。通过完整的代码示例和实战演示,帮助开发者快速掌握量化交易系统的基本原理和应用方法,实现自动化交易。

weixin_29269441的博客 490

自动驾驶仿真:python和carsim联合仿真案例

carsim内部有许多相关联合仿真的demo,simulink、labview等等都有涉及,这里简单介绍下python和carsim联合仿真的方法,虽然carsim官方有个Steer_Control.py相关的案例,但是感觉比较冗余,这里抽出重点部分和大家交流探讨下。提示:以下是本篇文章正文内容,下面案例可供参考1、这里关于solvers的细节其实都没说,因为里面确实也没什么内容好讲的,本质就是调用carsim.dll,如果你需要更多的函数解析其实可以看vs_api.h,路径在,具体内容如下图所示。

zataji的博客 9062

深入理解计算系统第三章程序的机器级表达总结

深入理解计算机系统 第三章总结

qqqingyi的博客 1537

【商业化】【msix打包】Python 应用打包为 MSIX 的正确流程:入口点问题与解决方案

发现用msix打包工具打包python做的exe时总找不到程序入口点,后来理了一下才发现自己误会了,需要先生成一个基本的setup.exe,msix的打包是基于这个初始的安装程序进行的。只需要点击Buile-》Compile,然后Open Output Folder就可以得到exe安装程序了。可以使用免费工具inno setup来创建初始安装包。其中{group}这样的变量会自动匹配,不用自己指定。如果点击Run会运行安装程序。

每日出拳老爷子的博客 1103

汇编:jmp指令

1、jmp为无条件转移,可以只修改IP,也可以同时修改CS和IP。 2、jmp指令要给出两种信息: 1、转移的目的地址 2、转移的距离(段间转移、段内短转移, 段内近转移)

chenzimin_blog 1万+

GPU算力租用平台推荐

阿里云作为中国领先的云计算服务提供商,提供了丰富的GPU云服务器实例,包括NVIDIA Tesla V100、A100等多种高性能GPU型号。阿里云GPU云服务器适用于深度学习、科学计算、图形渲染等多种场景,能够满足不同用户的计算需求。

hong161688的博客 8173

NLP DAY1: 文本数据读取

txt 文本数据的读写CSV 及 Excel 文本数据的读写更多的 DataFrame 操作数据规模太大怎么办相信通过本次实验的学习,同学们可以游刃有余地面对各种数据文件了。在接下来的实验中,我们将开始真正地开启自然语言处理之旅,开始认识并熟悉一些常见的针对文本本身的预处理操作。

feifeikon的博客 1058

jmp 指令

jmp指令  解释: n       jmp为无条件转移,可以只修改IP,也可以同时修改CS和IP; n       jmp指令要给出两种信息: n       转移的目的地址 n       转移的距离(段间转移、段内短转移,段内近转移) 格式: 一.Jump short 标号    这种格式的 jmp 指令实现的是段内短转移,它对IP的修改范围为 -128~127,也就是说,它

akktc5507的专栏 2244

51单片机也能玩转信号发生器?手把手教你用DAC0832和LM358输出四种标准波形

本文详细介绍了如何使用51单片机和DAC0832芯片搭配LM358运放,自制低成本信号发生器,实现正弦波、矩形波、三角波和锯齿波四种标准波形的输出。从硬件选型、电路设计到编程实现,手把手教你完成这一实用电子项目,总成本不到50元,适合电子爱好者和学生实践。

weixin_30530939的博客 551

JMP指令

JMP指令是汇编语言中的一种跳转指令。该指令分直接转移和间接转移两种,直接转移又可分短程(SHORT)、近程(NEAR)和远程(FAR)3种形式。当程序执行到JMP指令时,就无条件地转移到指令中所指示的目的地址。 1、短程转移(直接短转移)指令格式:JMP SHORT OPRD 语法格式:JMP 地址标号 ;(IP)=(IP)+8位位移量 指令功能:OPRD为转移地址的标号,指令中的SHORT规

aurorayqz的博客 1万+

S7-200 SMART PLC 子程序功能块(阀门控制)

由于S7-200 SMARTPLC的子程序种种功能、容量限制,有时想实现多次调用的子程序可能并不是太容易,这篇博客还是给出一些推荐写法,供大家参看。

RXXW_Dor的博客 8068

基于 Qt C++ 的金融行情交易终端

由于完整的商业级源码非常庞大,我将为你提供一个 **结构完整、可直接编译运行的基础框架**,并详细说明各模块的实现思路和扩展方向。double波动 = quote.lastPrice * (rand()%200 - 100) / 10000.0;// 订单缓存(orderId -> Order)

寒寒豆豆软件公司的博客 191

jmp、JE、JZ、JNE、JNT指令

JMP 指令无条件跳转到目标地址,该地址用代码标号来标识,并被汇编器转换为偏移量 格式: JMP destination 当 CPU 执行一个无条件转移时,目标地址的偏移量被送入指令指针寄存器,从而导致迈从新地址开始继续执行。 JMP 指令提供了一种简单的方法来创建循环,即跳转到循环开始时的标号: top: . . jmp top ;不断地循环 JMP 是无条件...

qq_41683305的博客 5万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jmp指令【原理详解 8086汇编语言+笔记】

指令格式示例jmp 标号-段间转移(远转移):jmp far ptr 标号-段内短转移:jmp short 标号;8位的位移-段内近转移:jmp near ptr 标号;16位的位移jmp 寄存器-jmp bx;等价于段内近转移,也是16位的位移jmp 内存单元(用地址表示的)-jmp word ptr 内存单元地址;段内转移-jmp dword ptr 内存单元地址;段间转移。

一只喜欢code的fox 2万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

汇编指令jmp的理解

 汇编指令jmp的理解 在学习汇编语言的时候遇到下面一段代码,起初简单地认为这个程序是不能正常结束的。但是经过debug单步跟踪之后,发现程序是能正常结束的,且出现了一种奇怪的现象:当程序从code:0005处开始执行到code:0014后,继续jmp指令跳到code:0008。然而,继续往前执行一步时,程序直接跳转到了code:0处,而不是预先想象的跳到code:0018(即标号s1段处

scuhank的专栏 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jmp 指令用法

汇编jmp指令 jmp指令  解释: n       jmp为无条件转移,可以只修改IP,也可以同时修改CS和IP; n       jmp指令要给出两种信息: n       转移的目的地址 n       转移的距离(段间转移、段内短转移,段内近转移) 格式: 一.Jump short 标号    这种格式的 jmp 指令实现的是段内短

2119

汇编jmp指令的理解与用法

这篇文章是在学习过程中对于转移地址偏移地址的理解以及网上缺乏帮助理解计算转移地址偏移地址的前提下诞生的。初次写知识点分享,如有误,请指出多包含。 JMP是在编写程序中经常使用的指令,它的功能是转移到指令指定的地址执行相应的指令。实际用法如下: 1,段内直接转移 1)短转移 JMP SHORT 转移地址标号 功能:改变IP;(即:(IP)=(IP)+8位位移量 其中:式子右边(IP)为JMP后第一个字节的偏移地址;8位位移量为JMP机器指令中EB后接的16进制数值。 下边我们通过一道例题理解JM

m0_63943951的博客 2万+

jmp指令2

在源程序中,不允许使用“jmp 2000:0100”的转移指令实现段间转移·这是在Debug中使用的汇编指令,汇编编译器并不认识。近转移:指令"jmp near ptr标号”短转移:“jmp short 标号”如果在源程序中使用,编译时也会报错。远转移jmp far ptr标号。

picktheshy的博客 1200

jmp指令的机器码编写

1.首先直接的jmp分3种 :      Short Jump(短跳转)机器码 EB rel8             只能跳转到256字节的范围内       Near Jump(近跳转)机器码 E9 rel16/32             可跳至同一个段的范围内的地址       Far Jump(远跳转)机器码EA ptr 16:16/32         

YSBJ123的博客 6422

JMP指令寻址方式总结,JMP BX指令寻址方式是什么

jmp dword ptr 内存单元地址 ( 段间转移) 高字地址存放cs 低字节存放ip。jmp far ptr 标号 超段转移 跳转包含目标地址jmp reg 16位寄存器。jmp short 标号 段间跳转 -128-127。jmp word ptr 内存单元地址 段内转移。jmp 指令的几种寻址方式。

我写写哈的博客 4090
上一篇: 内核的创建流程与代码分析
下一篇: 内联汇编
smallgeneral
博客等级 码龄19年 10粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值