本文主要是介绍IA32体系结构5(x86程序控制指令),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
转移指令
转移指令(JMP)允许程序员跳过一段程序,跳转到存储器的任何位置执行下一条指令。条件转移则允许程序员根据对数值的测试做出决定。这些数值测试的结果保存在标志位中,再由条件转移指令检测它们。
1.无条件转移指令
可以分为短转移、近转移、远转移。
短转移-2字节指令,允许在+127和-128字节范围内转移
近转移-3字节指令,允许在+32kb和-32kb范围内转移
远转移-5字节指令,允许转移到整个实存储器系统内的任何内存单元
短转移和近转移通常称为段内转移,远转移通常称为段间转移。
在80386以上处理器中,如果机器按保护模式运行,有4GB的代码段,则近转移是在+2GB和-2GB范围内;如果按实模式运行,则近转移是在+32kb和-32kb范围内。三种指令的机器码指令格式如下:
上图主要是以16位为例,如果是80386及以上处理器,运行在保护模式,位移量就是32位长。以上第二个近转移指令就是5字节指令,第三个就是7字节指令。
(1)短转移
短转移也称为相对转移,因为它们可以与相关的软件一起移动到当前代码段内的任何位置。这是因为转移地址不与操作码一起存储。替代转移地址的是操作码后面的距离,即位移量。短转移的位移量用一个字节的有符号数表示的距离,这个值的范围是+127到-128。微处理器执行短转移时,位移量先被符号扩展,然后加到指令指针(IP/EIP)上,从而得到当前代码段内的转移地址。举例如下:
START: mov ax, 1add ax, bxjmp SHORT NEXT
NEXT:mov bx, axjmp START
(2)近转移
除了距离较大以外,近转移类似于短转移。80386及以上cpu,保护模式下近转移的位移量位32位长,其代码段长度达4GB,因此32位的位移量允许近转移到2GB~-2GB范围。近转移同样也是可重定位的,因此它也是相对转移。如果代码段移到存储器新的位置,转移指令与操作数之间的距离保持不变,就允许通过简单的移动代码段实现重定位。这个特性与可重定位数据段一起使得intel系列处理器完美地用于通用计算机系统。
(3)远转移
远转移从指令中得到新的段地址和偏移地址,以实现转移。
as86汇编器中,段间跳转使用jmpi汇编指令,指令中带上段和偏移,比如bootsect.s里面的"jmpi go,INITSEG"。
2.条件转移指令
8086~80286微处理器的条件转移指令都是短转移,这就把条件转移的范围限制在相对条件转移指令位置的+127到-128字节以内。80386以上的微处理器,条件转移是短转移或是近转移,因此允许这些微处理器有条件地转移到当前代码段内的任何位置。
3.过程调用
CALL指令跳转到过程,RET指令从过程返回。执行跳转时,CALL指令将其后的指令地址压入堆栈,RET指令从堆栈弹出地址,返回到CALL指令之后的指令运行。
(1)近CALL指令
近CALL指令有3字节长,第1个字节包含操作码。对于8086~80286微处理器,第2和第3字节包含正负32KB的位移量或距离,这与近转移指令的格式想同。80386以上的微处理器按保护模式操作时用32位的位移量,允许正负2GB的距离。
(2)远CALL指令
远CALL指令的操作码后面跟随IP和CS寄存器的值,执行时先将IP和CS内容压入堆栈。
(3)RET指令
RET指令从堆栈中取出16位数字(近返回)放入IP,或者取出32位数字(远返回)放入IP和CS中。
这篇关于IA32体系结构5(x86程序控制指令)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!