操作

  1. 将当前的ip或cs压入栈中
  2. 转移

这里的转移与jmp相同,也有位移和内存两种方式

根据位移

call 标号(将ip压入栈中后,转移到标号处进行指令)
过程:

  1. sp+=2,ss*16+sp=ip
  2. ip=ip+16位位移

16位位移=标号处地址-call指令后第一个字节的地址

相当于 push ip,jmp near ptr 标号

根据目的地址

call far ptr 实现段间转移

操作:

  1. sp-=2
  2. ss16+sp=cs
    3.sp-=2
    4.ss
    16+sp=ip
  3. cs=标号所在段地址,ip=;标号所在偏移地址

段内转移一般是根据位移,段间转移一般是根据地址

如果地址在寄存器中, call reg,ip被修改

如果地址在内存中

1 call word ptr 内存地址

这种是段内转移,相当于 push ip,jmp word ptr

2 call dword ptr 内存地址

段间转移 例

call dword ptr ds:[0] ,这样ds:[0]和ds:[1]是ip ,ds:[2]和ds:[3]是cs