CALL指令是x86CPU中专门用作函数调用的指令,它的作用就是将当前的程序指针(EIP寄存器)值保存到栈中(称为linking information),然后转移到(branch to)目标操作数所指定的函数(被调用过程)继续执行。
根据被调用过程是否位于同一个代码段,CALL调用被分为近调用(Near Call)和远调用(Far Call)两种。在近调用中CPU的操作如下:
A. 将EIP寄存器的当前值压入到栈中供返回时使用
B. 将被调用过程的偏移(相对于当前段)加载到EIP寄存器中
C. 开始执行被调用过程
对于远调用,CPU执行的操作如下:
A. 将CS寄存器的当前值压入到栈中供返回时使用
B. 将EIP寄存器的当前值压入到栈中返回时使用
C. 将包含被调用过程的代码段的段选择子加载到CS寄存器
D. 被调用过程的偏移加载到EIP寄存器
E. 开始执行被调用过程
可以看出近调用和远调用的差异在于是否处理段寄存器,因为近调用发生在一个代码内的调用,因此不需要向栈中压入和切换代码段,而远调用因为发生在不同的代码段间,因此需要保存和切换代码段。但对于NT系列的windows,因为使用了平坦内存,在同一进程内的代码都是在一个大的4GB段中,因此不必再考虑段的差异,几乎所有时候使用的都是近调用。
下面来看RET指令,RET指令用于从被调用过程返回到发起调用的过程,RET指令可以有一个可选的参数n,用于指定ESP寄存器要递增的字节数,ESP递增n个字节相当于从栈中弹出n个字节,经常用来释放压在栈上的参数。相对于近调用的返回称为近返回(Near Return),相对于远调用的被称为远返回(Far Return)。
对于近返回,CPU所执行的操作如下:
1. 将位于栈顶的数据弹出到EIP寄存器,这个值应该是发起近调用时CALL指令压入的返回地址。
2. 如果RET指令包含参数n,那么便将ESP寄存器的字节数递增n。
3. 继续执行程序指针所指向的指令,通常就是父函数中调用指令的下一条指令。
而对于远返回,在第一步和第二步之间,CPU会弹出执行远调用时压入的CS寄存器。所以,RET指令只是单纯地返回到执行这条指令时栈顶所保存的地址,如果栈寄存器(ESP)没有指向合适的位置或栈上的地址被破坏了,那么RET指令就返回到其他地方。
分享到:
相关推荐
《汇编语言》(王爽)第10章_call_和_ret_指令《汇编语言》(王爽)第10章_call_和_ret_指令《汇编语言》(王爽)第10章_call_和_ret_指令
汇编语言讲稿call和ret指令PPT学习教案.pptx
10240.16384.150709-1700.th1_CLIENTCHINA_RET_x64fre_zh-cn.esd CoreConnectedCountrySpecific 10240.16384.150709-1700.th1_CLIENTCHINA_RET_x64fre_zh-cn.esd CoreCountrySpecific 10240.16384.150709-1700.th1_...
简略的显示了 保护模式的下 Call Jmp Ret 指令引起的控制转移
介绍了leave和ret汇编指令在使用中的难点
软件漏洞分析入门 中的文件 stack_overflow_ret
兼容RET设备,程序用于通信行业的电调天线
第七章我故意把 call 和 ret 指令留到这个部分来讲,因为你们必须得弄明白前面的基础知识,有了前面的基础,我们现在来介绍 call 和 ret。尽管这两条
Retinex代码,图像增强,是一种比较新的算法,算法很新颖
GD32F10x_USB_FS_Device_Lib_V1.0.0_RET6.rar
使用OllyDbg从零开始Cracking 第七章-call,ret.doc
RETAS_STUDIO_6.5.6_汉化版
oracleLinux7.8 centos7.8 安装oracle12c 所需要的rpm库文件 有这些文件,服务器不需要联网 即可有所需要的全部库文件。 详细使用看我的博客文章。
C语言头文件 RETCODEC语言头文件 RETCODEC语言头文件 RETCODEC语言头文件 RETCODEC语言头文件 RETCODEC语言头文件 RETCODEC语言头文件 RETCODEC语言...RETCODEC语言头文件 RETCODEC语言头文件 RETCODEC语言头文件 RET
static rtk_api_ret_t _rtk_l2_init(void) { rtk_api_ret_t retVal; rtk_uint32 port; /* Check initialization state */ RTK_CHK_INIT_STATE(); if ((retVal = rtl8367c_setAsicLutIpMulticastLookup...
CALL、RET 中断调用与返回指令 INT n、 IRET 串操作 指令 MOVS、CMPS、LODS、STOS、SCAS 处理器 控制 指令 标志操作指令 CLC、STC、CLD、STD、CLI、STI 处理机控制指令 HLT
波浪处理软件,能有效的处理海浪的高度,以及海浪的强度
RETC是土壤物理研究中运用得比较多的软件,常用于绘制土壤水分特征曲线
上有sqlite的各个方法的详细解释和例子,是英文帮的。。
汇编语言的全部课外答案 第1章 基础知识 第2章 寄存器 答案 第3章 寄存器(内存访问) ...第10章 CALL和RET指令 第11章 标志寄存器 第12章 内中断 第13章 int指令 第14章 端口 第15章 外中断 第16章 直接定址表