函数调用一般是通过call指令和ret指令相互配合使用来实现的,当函数运行到call指令时,call指令会做两件事:1,将当前的ip压入栈中;2,跳转到call指令后被调用的函数。
当被调用函数运行完毕之后,通过ret指令返回到函数中,ret指令也会做两件事:1,将之前压入栈中的ip出栈,2,跳转到ip所指向的地址,函数开始运行call指令的下一步指令。
除此之外,call指令还有以下用法:
- 转移地址在指令中的call指令,
call far ptr+标号,
此时相当于
Push CS
Push IP
Jmp far ptr 标号 - 转移地址在寄存器中的call指令,
call 16位寄存器;
此时相当于
Push IP
Jmp 16位寄存器 - 转移地址在内存中的call指令,
有两种格式:
Call word ptr + 内存单元地址;
相当于
Push ip
Jmp word ptr 内存单元地址
Call dword ptr + 内存单元地址;
相当于
Push CS
Push ip
Jmp dword ptr 内存单元地址