您的位置:首页 > 其它

【汇编语言/底层开发】9、转移指令的原理

2015-01-07 22:38 218 查看
可以修改IP或者同时修改CS和IP的指令统称为转移指令。转移指令控制CPU执行内存中某处的代码,其作用相当于C语言中的GOTO。在C语言中并不鼓励使用goto语句,但是在汇编语言中由于没有复杂的流程控制运算符,使用转移指令称为必然。在8086中,转移指令可分为以下几类:(1)无条件转移指令;(2)条件转移指令;(3)循环指令;(4)过程;(5)中断。

1、操作符Offset;

操作符offset是由编译器处理的符号,功能是取得标号所在的偏移地址。

2、jmp指令:

jmp为无条件跳转指令,可以修改IP或同时修改CS和IP。使用jmp指令需要给出的信息有:转移的目的地址;转移的距离(段间转移、段内短转移、段内近转移);

jmp指令有四种使用方式:

(1)依据位移进行转移的jmp指令

以下指令:

jmp short mark ;mark是某条指令的标号


该指令实现段内短转移,ip的变化范围为-128~127。转移指令结束后,CS:IP指向mark处所标识的指令位置。

同mov、push等指令不同的是,jmp指令的机器码中并不包含将要跳转的目标地址,而前两者的机器码都明确包含了将要操作的立即数值。这是因为CPU执行jmp指令时并不需要转移的目的地址,而采用的是标号所在地的地址同jmp指令的偏移。也就是说,jmp中其实也是包含了目标地址的,只是采用的是以当前地址为基准的相对地址。

与上述指令相似的还有:

jmp near ptr mark

该指令实现是段内近转移,其转移的位移为16为,范围为-32768~32767。near同short的主要区别在于jmp的范围更大些。

(2)转移目的地址在指令中的jmp指令

与(1)描述的段内短转移和近转移不同,以下指令:

jmp far ptr mark
实现的是段间转移或远转移。这个指令中的far ptr表示将使用mark所在的段地址和偏移地址分别修改cs和ip,处理的场合是当前指令位置同目标指令位置距离较远,超过短转移和近转移,或者二者在不同的段中的情况。

(3)目标地址在寄存器中的jmp指令

以下指令:

jmp ax
目标的ip地址存放在ax中。功能同近转移指令类似。

(4)转移目标地址在内存中的jmp指令

通过内存单元获取转移地址有字和双字两种方式。通过字获取的格式为:jmp word ptr 内存地址;通过双字获取的格式为:jmp dword ptr 内存地址。前者只改变ip,新的ip值来自于给定的内存地址;后者同时改变cs和ip,双字的高位表示段地址,低位表示偏移地址。

以下指令:

mov ax, 0123H
mov ds, ax
jmp word ptr ds:[0]
其作用为修改ip为0123h。

以下指令:

mov ax, 0123H
mov bx, 0
mov ds:[0], ax
mov word ptr ds:[2], bx
jmp dword ptr ds:[0]
其作用为将cs修改为0,ip修改为0123h。

3、条件转移指令和循环指令

实现二者的指令分别为jcxz和loop指令,二者都是短转移指令。

(1)jcxz指令:

该指令的构成为:j(jmp)cx(寄存器cx)z(zero),即当cx中的值为0时跳转,非零时继续向下执行;使用格式为:

jcxz mark


(2)loop指令:

使用格式为:

loop mark


每次运行后,cx会自减1,当cx为0时,不进行跳转,向下执行。该指令的最大作用是实现一个循环的功能,使用cx计算循环的次数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: