转移指令
我们把可以修改IP,或者同时修改CS和IP的指令统称为转移指令
- 如果只修改IP的称为段内转移,比如说jmp ax
- 同时修改CS和IP的称为段间指令,比如说jmp 1000:0
由于转移指令对IP的修改范围的不同,软内转移又可以分为短转移和近转移
短指令IP的修改范围为-128~127
近转移IP的修改范围为-32768~32767
jmp为无条件转移指令,可以只修改IP,也可以同时的去修改CS和IP,jmp指令的用法如下所示
- jmp short 标号 这种格式的jmp指令实现的是段内短转移,它对IP的修改范围为-128~127,也就是说,它向前转移的时候可以最多为128个字节,向后转移可以最多是越过127个字节,这里的short指的是短转移的意思,对于这种格式的指令,CPU在执行jmp指令的时候不需要转移的目的地址
我们先看看CPU执行指令的过程再看后面的实例
- 1、从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器
- 2、(IP)=(IP)+ 所读取的指令的长度,这样可以指向下一条指令
- 3、执行指令,然后再接着执行1
汇编指令如下所示
assume cs:codesg
codesg segment
start:mov ax,0
mov bx,0
jmp short s
add ax,1
s:inc ax
mov ax,4c00h
int 21h
codesg ends
end start
执行结果,AX为1
jmp short 标号 的功能就是(IP)= (IP)+ 8位位移
- 8位位移=标号处的地址-jmp指令后的第一个字节的地址
- short指明此处的位移为8位位移
- 8位位移的范围为-128~127
- 8位位移由编译程序在编译的时候算出
对于jmp far ptr 标号 这种形式实现的是段间转移,又称为远转移
还可以有jmp 16位的寄存器,这个改变的就是(IP)=(16位的寄存器)
转移地址在内存当中的jmp指令,有两种格式
- 1、jmp word ptr 内存单元地址(段内转移)
- 2、jmp dword ptr 内存单元地址(段间转移)
jcxz指令为有条件转移指令,所有的有条件转移指令都是短转移,在对应机器码中包含转移的位置,而不是目的地址,对IP的修改范围都为-128~127,jcxz指令其实就是如果cx=0就转移到标号处执行
对于loop指令,它为循环指令,所有的循环指令都为短转移,在对应的机器码当中包含的是转移的位移,而不是目的地址,对IP的修改范围都为-128~127,loop指令其实就是如果cx!=0,就转移到标号处去执行,执行步骤如下所示
- (cx)=(cx)-1
- 如果(cx)!=0,(IP)=(IP)+8位位移
8位位移= 标号处的地址-loop指令后的第一个字节的地址 8位位移的范围为-128~127,用补码来表示