offset 标号
取得标号处的偏移位置
jmp short 标号
段内短跳转
(IP)=(IP)+8位位移 【有符号的位移(-128~127)】
jmp near ptr 标号
段内近转移
(IP)=(IP)+16位位移 【有符号的位移(-132768~32767)】
jmp far ptr 标号
段间转移
(CS)=标号所在段的段地址
(IP)=标号在段中的偏移地址
比如:
EA 0B 01 BD OB
高地址"BD OB" ==> 转移的段地址
低地址"0B 01" ==> 偏移地址
jmp 16位寄存器
(IP)=(16位寄存器)
jmp word ptr 内存单元地址(段内转移)
从内存单元地址处开始存放着一个字,是转移的目的偏移地址
(IP)=(内存单元地址)
jmp dword ptr 内存单元地址(段间转移)
从内存单元地址处开始存放着两个字
高地址处的字 ==> 转移的目的段地址
低地址处的字 ==> 转移的目的偏移地址
(CS)=(内存段元地址+2)
(IP)=(内存单元地址)
jcxz 标号
有条件转移指令
所有的有条件转移指令都是短转移
对应的机器码中包含转移的位移,而不是目的地址【IP范围(-128~127)】
当(CX)=0时,(IP)=(IP)+8位位移
loop 标号
(CX)=(CX)-1,如果(CX)!=0,转移到标号处执行
1、(CX)=(CX)-1
2、如果(CX)!=0,(IP)=(IP)+8位位移
注意:
nop
相当于占位符,一个字节大小
ret和retf
ret
ret指令用栈中的数据,修改IP的内容,从而实现近转移
1、(IP)=((ss)*16+(sp))
2、(sp)=(sp)+2
retf
retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移
1、(IP)=((ss)*16+(sp))
2、(sp)=(sp)+2
3、(CS)=((ss)*16+(sp))
4、(sp)=(sp)+2
call 标号
将当前的IP压入栈后,转到标号处执行指令
1、(sp)=(sp)-2
2、((ss)*16+(sp))=(IP)
3、(IP)=(IP)+16位位移
call far ptr 标号
1、
(sp)=(sp)-2
((ss)*16+(sp))=(CS)
(sp)=(sp)-2
((ss)*16+(sp))=(IP)
2、
(CS)=标号所在的段地址
(IP)=标号所在的偏移地址
call 16位寄存器
功能:
(sp)=(sp)-2
((ss)*16+(sp))=(IP)
(IP)=16位寄存器
call word ptr 内存单元地址
汇编语法解释:
push IP
jmp word ptr 内存单元地址
call dword ptr 内存单元地址
汇编语法解释:
push CS
push IP
jmp dword ptr 内存单元地址