一、call指令
1.1 依据位移进行转移:call 标号
1.2 实现段间转移:call far ptr 标号
1.3 转移地址在寄存器中:call 16位寄存器
1.4 转移地址在内存中
1.4.1 call word ptr 内存单元地址
1.4.2 call dword ptr 内存单元地址
二、ret和retf指令
2.1 ret指令:近转移
2.2 retf指令:远转移
call和ret指令都是转移指令,它们都能修改ip,或同时修改cs和ip。call和ret需要配合使用。
一、call指令
CPU执行call指令,进行两步操作:
- 将当前的ip或cs和ip压入栈中
- 转移
call指令不能实现短转移,除此之外,call指令实现转移的方法和jmp指令的原理相同。
1.1 依据位移进行转移:call 标号
执行的操作如下:
- (sp) = (sp)-2 ;栈顶移动
- ((ss)*16+(sp)) = (ip) ;当前ip内容压栈
- (ip) = (ip)+16位位移 ;跳转到标号处
相当于执行:
- push ip
- jmp near ptr 标号
1.2 实现段间转移:call far ptr 标号
执行的操作如下:
- (sp) = (sp)-2 ;栈顶移动
- ((ss)×16+(sp)) = (cs) ;先把cs压栈
- (sp) = (sp)-2 ;栈顶移动
- ((ss)×16+(sp)) = (ip) ;然后把ss压栈
相当于执行:
- push cs
- push ip
- jmp far ptr 标号
1.3 转移地址在寄存器中:call 16位寄存器
执行的操作如下:
- (sp) = (sp) - 2
- ((ss) × 16 + (sp)) = (ip)
- (ip) = (16位寄存器)
相当于执行:
- push ip
- jmp 16位寄存器
1.4 转移地址在内存中
1.4.1 call word ptr 内存单元地址
汇编语法解释:
- push ip
- jmp word ptr 内存单元地址
1.4.2 call dword ptr 内存单元地址
汇编语法解释:
- push cs
- push ip
- jmp dword ptr 内存单元地址
二、ret和retf指令
2.1 ret指令:近转移
ret指令用栈中的数据,修改ip的内容,从而实现【近转移】
CPU执行ret指令时,进行下面两步操作:
- (ip)=((ss)*16+(sp)) ;ip的值修改为栈顶的内容
- (sp)=(sp)+2 ;栈顶移动
相当于执行:
- pop ip
2.2 retf指令:远转移
retf指令用栈中的数据,修改cs和ip的内容,从而实现【远转移】
CPU执行retf指令时,进行下面四步操作
- (ip)=((ss)*16+(sp)) ;ip的内容修改为栈顶的内容
- (sp)=(sp)+2 ;栈顶移动
- (cs)=((ss)*16+(sp)) ;cs的内容修改为栈顶移动之后,栈顶的内容
- (sp)=(sp)+2 ;栈顶移动
相当于执行:
- pop ip
- pop cs