您的位置:首页 > 其它

汇编语言08——转移指令的原理

2014-08-17 15:49 387 查看
整理自fishcc论坛

转移指令的原理

8086CPU的转移指令的分类:

无条件转移指令(如jmp)

条件转移指令

循环指令(如loop)

过程(类似C语言中函数)

中断

操作符offset

取得标号的偏移地址

例:

start: mov ax,offset start
;相当于mov ax,0

s: mov ax,offset s
;相当于mov ax,3 (上一条语句占用3个字节)

jmp指令

无条件转移指令,可以只修改IP,也可以同时修改CS和IP

使用jmp指令需要给出两种信息

1,转移的目的地址

2,转移的距离(段间转移,段内短转移,段内近转移)

jmp short 标号

这种格式是jmp指令实现段内短转移,它对IP的修改范围为-128-127(8位位移)

例:

start: mov ax,0

jmp short s

add ax,1

s: inc ax

上面程序中的add指令将被跳过,不去执行

jmp near ptr 标号

这种格式是jmp指令实现段内近转移,它对IP的修改范围为-32769-32767(16位位移)

jmp far ptr 标号

段间转移,又称为远转移

远转移对应的机器码中包含了要转移目的地的段地址和偏移地址

上面的jmp指令都是使用jmp跳到一个指定标号处,当目标地址在内存中存储时,使用下面的两种形式

1,jmp word ptr 内存单元地址(段内转移)

例如: mov ax,0123H

mov ds:[0],ax

jmp word ptr ds:[0]

2,jmp dword ptr 内存单元地址(段间转移)

dword的内存单元地址中,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移

有条件转移指令:jcxz指令

所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。

对IP的修改范围都为-128~127。

指令格式:jcxz 标号

当(cx)=0时,(IP)=(IP)+8位位移)

8位位移=“标号”处的地址-jcxz指令后的第一个字节的地址;

8位位移的范围为-128~127,用补码表示;

8位位移由编译程序在编译时算出。

当(cx)!=0时,什么也不做(程序向下执行)。

总结:

跳转的几种形式:

jmp short 标号

jmp near ptr 标号

jcxz 标号

loop 标号

它们对 IP的修改是根据转移目的地址和转移起始地址之间的位移来进行的。

在它们对应的机器码中不包含转移的目的地址,而包含的是到目的地址的位移距离

这样做是为了程序段在内存中的浮动装配(在大部分内存处都能运行)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: