汇编中的跳转指令从大体上分为无条件转移指令和条件转移指令。下面就围绕着这两个大的方面来探究下汇编语言的跳转指令。
一、无条件转移指令
无条件转移指令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,如需转载请自行联系原作者