开发者社区> 技术小胖子> 正文

那些年,我们一起学过的汇编----之跳转指令

简介:
+关注继续查看

汇编中的跳转指令从大体上分为无条件转移指令和条件转移指令。下面就围绕着这两个大的方面来探究下汇编语言的跳转指令。

 
一、无条件转移指令
无条件转移指令JMP将无条件地转移到指令的目的地址去执行指令,因此JMP指令必须指定转移的目标地址
无条件转移指令可以分为两类:段内跳转和段间跳转,段内转移是指在同一段的范围内运行转移。此时转移指令将改变IP寄存器的值,即用新的转移目标地址代替原有的IP寄存器的值来实现转移,因此,此时的目标地址给出偏移量即可,段间转移是要转移到另一个逻辑段去执行程序,此时不仅要修改IP寄存器的值,而且还需要修改CS寄存器的值才能达到转移的目的,因此,此时的目标地址应由段基值和偏移量两部分组成。
1、段内转移
段内转移时,指令和要转移的目标指令同属于一个段,因此只需修改寄存器IP的值,而代码段寄存器CS的值保持不变,所以指令中给出目标指令的偏移量即可。根据给出目标指令偏移量的方式,JMP指令的寻址方式分为段内直接寻址和段内间接寻址。
【a】、段内转移直接寻址
指令的操作数部分直接给出目标指令的偏移量。在这种情况之下,一般使用标号来作为JMP指令的操作数,指令格式如下。
段内转移直接寻址:
JMP NEAR PTR TARGET
执行的操作IP<--(IP)+TARGET与JMP指令的下一条指令的16位位移量距离。
【b】、段内转移间接寻址
JMP指令转移到目标地址在某一个通用寄存器中或者某一个字存储单元中。段内转移间接寻址的指令格式为:
JMP REG
JMP WORD PTR ADDR
在JMP REG中,REG为通用寄存器,执行的操作为:
IP<---通用寄存器REG的内存
在JMP WORD PTR ADDR中,ADDR为各种寻址方式确定的存储单元地址,并且在无歧义的情况下WORD PTR可以省略不写,执行的操作为:
IP<---字存储单元ADDR的内存
 
2、段间转移
由于这种转移是从一个逻辑段转移到另一个逻辑段,所以执行短剑转移指令时,代码段寄存器CS和指令指针IP的值都要修改。同样,根据目标指令给出地址的方式,可分为短剑转移直接寻址和段间转移间接寻址。
【a】、段间转移直接寻址
指令的操作数部分通过标号直接给出目标指令的段基值和偏移量,指令格式如下:
JMP FAR PTR TARGET
执行的操作为:
IP<---TARGET的偏移量
CS<---TARGET的段基值
【b】、段间转移间接寻址
JMP指令转移的目标地址在某一个双字存储单元中,段间转移间接寻址的指令格式为:
JMP DWORD PTR ADDR
执行操作为:
IP<---ADDR的第一个字存储单元中的内容
CS<---ADDR的第二个字存储单元中的内容
 
二、条件转移指令
条件转移指令是根据CPU中标志寄存器的个状态位,入符号位SF,零值位ZF,进位位CF,奇偶位PF与溢出位OF等决定程序的执行流程,条件转移指令是以标志寄存器各状态为为条件,如果条件成立,则控制转移到指令中国所给出的转移目标。条件不成立,程序将顺序执行,关于标志寄存器的内容请看我的另一篇博文,(http://yiluohuanghun.blog.51cto.com/3407300/938213)。
条件转移指令一般在算术运算、逻辑运算或移位运算等对标志寄存器有影响的指令之后,根据这些指令操作后影响的状态标志决定是否发生转移。
关于条件转移指令的细分,我在网上看到一篇不错的文章,大家有兴趣的可以参考下http://hi.baidu.com/jan008yy/blog/item/5b5b07d915a678ef38012f31.html,我在这里就不再一一解释。
到此为止,我们已经掌握了最基本的跳转指令。这部分知识对于我们在后续篇章中讲到的汇编,言分支程序设计是必要的。
 

     本文转自 驿落黄昏 51CTO博客,原文链接:http://blog.51cto.com/yiluohuanghun/940123,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
计算机图形学遇上深度学习
今日,TensorFlow 宣布推出 TensorFlow Graphics,该工具结合计算机图形系统和计算机视觉系统,可利用大量无标注数据,解决复杂 3D 视觉任务的数据标注难题,助力自监督训练。
2346 0
PostgreSQL 锁
锁的类型 /* NoLock is not a lock mode, but a flag value meaning "don't get a lock" */ #define NoLock 0 #define AccessS...
1215 0
独家揭秘:阿里小程序的一云多端!看这篇就够了!
阿里巴巴小程序一云多端的整体战略,以及阿里小程序后续为开发者提供的云服务(云应用、云开发等)、开发者工具链(IDE、插件、SDK等)、跨端框架能力说明。同时结合繁星计划后续提供给开发者的扶持和ISV的权益体系做一个整体的介绍。
27536 0
GDB 调试 Mysql 实战(一)源码编译安装
下载源码 git clone https://github.com/mysql/mysql-server.git cd mysql-server git checkout 5.7 编译安装 安装依赖 yum install -y cmake make gcc gcc-c++ ncurses-dev...
1049 0
HSF/Dubbo序列化时的LocalDateTime, Instant的性能问题
### 来源 在对Dubbo新版本做性能压测时,无意中发现对用例中某个TO(Transfer Object)类的一属性字段稍作修改,由Date变成LocalDateTime,结果是吞吐量由近5w变成了2w,RT由9ms升指90ms。
2509 0
CDN的HTTPS配置及故障排除
相较于HTTP协议来说,HTTPS协议在网络链路中传输更具有安全可靠性,因为它通过SSL证书在链路中间对我们七层的网络包做了加密,进而防止了一些恶意的内容劫持。针对于这种场景,阿里云CDN也提供了相关的功能,可以支持客户端到CDN L1节点的HTTPS的协议。
1613 0
21117
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载