111111
精灵王
精灵王
  • 注册日期2010-12-08
  • 发帖数640
  • QQ
  • 火币1103枚
  • 粉丝120
  • 关注75
  • 社区明星
阅读:2530回复:0

经典汇编语言教程:5.2.9 转移指令

楼主#
更多 发布于:2013-01-24 14:30

转移指令是汇编语言程序员经常使用的一组指令。在高级语言中,时常有“尽量不要使用转移语句”的劝告,但如果在汇编语言的程序中也尽量不用转移语句,那么该程序要么无法编写,要么没有多少功能,所以,在汇编语言中,不但要使用转移指令,而且还要灵活运用,因为指令系统中有大量的转移指令。
转移指令分无条件转移指令和有条件转移指令两大类。
1、无条件转移指令(TransferUnconditionally)
无条件转移指令包括:JMP、子程序的调用返回指令、中断的调用返回指令等。
下面只介绍无条件转移指令JMP(UnconditionalJump)。
JMP指令的一般形式:
JMP  标号/Reg/Mem
JMP指令是从程序当前执行的地方无条件转移到另一个地方执行。这种转移可以是一个短(short)转移(偏移量在[-128,127]范围内),近(near)转移(偏移量在[-32K, 32K]范围内)或远(far)转移(在不同的代码段之间转移)。
短和近转移是段内转移,JMP指令只把目标指令位置的偏移量赋值指令指针寄存器IP,从而实现转移功能。但远转移是段间转移,JMP指令不仅会改变指令指针寄存器IP的值,而且还会改变代码段寄存器CS的值。
该转移指令的执行不影响任何标志位。
例如:
next1:
JMPnext1;向前转移,偏移量之差为负数
JMPnext2;向后转移,偏移量之差为正数
next2:

在目前流行的汇编系统中,当段内转移时,有些软件把该转移指令默认为近转移,从而使指令的偏移量用一个字来表示,于是生成3个字节的指令代码,但如果程序员自己清楚转移的幅度在一个短转移的范围之内,那么,可用前置short的办法来告诉汇编程序,让它产生2个字节的指令代码。
比如:如果程序员知道在上例中的标号next2离“JMPnext2”指令的偏移量不会超过127,那么,可用下面的转移方式来省掉一个字节的指令代码。
next2:
JMPshort next2;生成2个字节的转移指令,从而节省一个字节

喜欢0 评分0
游客

返回顶部