CPU执行call指令时,进行两步操作:
1、将当前的IP或CS和IP压入栈中;
2、转移;
call指令不能实现短转移。与jmp指令实现转移的原理相同。
1、依据位移进行转移的call指令
指令形式:call 标号
进行如下操作:
(1)、sp=sp-2
(2)、ss*16+sp=ip
(3)、IP=IP+16位位移
16位位移由编译程序在编译时算出
相当于进行:
push IP
jmp near ptr 标号
2、转移的目的地址在指令中的call指令
call far ptr 标号 ;实现的是段间转移
执行过程如下:
(1)、sp=sp-2;
ss*16+sp=cs;
sp=sp-2
ss*16+sp=ip
(2)、CS=标号所在段的段地址
IP=标号所在段中的偏移地址
相当于进行:
push CS
push IP
jmp far ptr 标号
3、转移地址在寄存器中的call指令
指令格式:call 16位 reg
功能:sp=sp-2
ss*16+sp=ip
ip=16位reg
相当于push IP
jmp 16位reg
4、转移地址在内存中的call指令
有两种形式
(1)、call word ptr 内存单元地址
相当于进行
push IP
jmp word ptr 内存地址
例如:
mov sp,10h
mov ax,0123h
mov ds:[0],ax
call word ptr ds:[0]
执行后 IP=0123h,sp=0;
(2)、call dword ptr 内存单元地址
相当于进行:
PUSH CS
PUSH IP
jmp dword ptr 内存单元地址
比如,下面的指令
mov sp,10h
mov ax,0123h
mov ds:[0],ax
mov word ptr ds:[2],0
call dword ptr ds:[0]
执行后:cs=0,ip=0123h,sp=0ch;