第九章 转移指令的原理 其一
8086cpu的转移指令分为以下几类:
无条件转移指令(如:jmp)
条件转移指令
循环指令
过程
中断
9.1 操作符0ffset
操作符offset在汇编语言中是由编译器处理的符号,他的功能是取得标号的偏移地址。
9.2 jmp指令
jmp为无条件转移,可以只修改ip,也可以同时修改cs和ip
jmp指令给出两种信息:
1.转移的目的地址
2.转移的距离(段间距离、段内段转移,段内近转移)
9.3依据位移进行转移的jmp指令
jmp short 标号(转到标号处执行指令)
这种格式的jmp指令实现的是段内段转移,他对ip的修改范围为-128~127,也就是说,它向前转移时可以最多越过128个字节,向后转移可以最多越过127个字节。
我们先来复习一下CPU执行指令的过程:
1)从cs:ip指向内存单元读取指令,读取的指令进入指令缓冲区。
2)(ip)=(ip)+所读取指令的长度,从而指向下一条指令。
3)在指令缓冲区执行指令。转到1,重复这个过程。
在jmp short 指令所对应的机器码中,并不包含转移的目的地址,而包含的是转移的位移。
这个位移,使编译器根据汇编指令中的标号计算出来的。
实际上,指令jmp short标号的功能为ip=ip+8位位移。
1)8位位移=标号处的地址-jmp指令后的第一个字节的地址。
2)short指明此处的位移为8位位移
3)8位位移的范围为-128~127,用补码表示
4)8位位移由编译程序在编译时算出。
还有一种和指令jmp short 标号功能相近的指令格式:
jmp near ptr 标号
它实现的是段内近转移。
指令jmp near ptr 标号的功能为:
ip=ip+16;
指令jmp near ptr标号的说明:
1)16位位移=标号处的地址-jmp指令后的第一个字节的地址。
2)near ptr指明此处的位移为16位位移,进行的是段内近转移。
3)16位转移的范围为:-32768~32767,用补码表示。
4)16位位移由编译器程序在编译时算出。
9.4转移的目的地址在指令中的jmp指令
前面讲的jmp指令,其对应的机器码中并没有转移的目的地址,而是相对于当前ip的转移位移。
指令jmp far ptr 标号
实现的是段间转移,又称为远转移。
指令jmp far ptr 标号功能如下:
cs=标号所在段的段地址
ip=标号所在段中的偏移地址
far ptr 指明了指令用标号的段地址和偏移地址修改cs和ip
9.5 转移地址在寄存器中的jmp指令
指令格式:jmp16位寄存器
功能:ip=(16位寄存器)
9.6转移地址在内存中的jmp指令
转移地址在内存中的jmp指令有两种格式:
1)jmp word ptr 内存单元地址(段内转移)
功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。
内存单元地址可用寻址方式的任一格式给出
示例:
mov ax,0123h
mov ds:[0],ax
jmp word ptr ds:[0]
执行后,ip=0123h
mov ax,0123h
mov [bx],ax
jmp word ptr [bx]
执行后,ip=0123h
转移地址在内存中的jmp指令的第二种格式:
2)jmp dword ptr 内存单元地址(段间转移)
功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处的是转移的目的偏移地址。
cs=(内存单元地址+2)
ip=(内存单元地址)
示例:
mov ax,0123h
mov ds:[0],ax
mov word ptr ds:[2],0
jmp dword ptr ds:[0]
执行后,
cs=0
ip=0123h
cs:ip指向0000:0123
mov ax,0123h
mov [bx],ax
mov word ptr [bx+2],0
jmp dword ptr [bx]
执行后:
cs=0
ip=0123h
cs:ip指向0000:0123