C语言堆栈帧的介绍与创建方式
本篇内容主要讲解“C语言堆栈帧的介绍与创建方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言堆栈帧的介绍与创建方式”吧!
什么是堆栈帧?
堆栈帧(stack frame)是一块堆栈保留区域,用于存放被传递的实际参数,子程序的返回值、局部变量以及被保存的寄存器。
堆栈帧的创建方法??【32bit Windows】
(1)被传递的实际参数。如果有,则压入堆栈;
(2)当子程序被调用时,使该子程序的返回值压入堆栈。如果使用寄存器保存返回值,则跳过此步;
(3)子过程返回地址入栈;
(4)子程序开始执行时,EBP被压入堆栈;
(5)设置EBP等于ESP。从现在开始,EBP就变成了该子程序所有参数的引用基址;
(6)如果有局部变量,修改ESP以便在堆栈中为这些变量预留空间;
(7)如果需要保存寄存器,则将它们入栈;
我们来看一段code?
#include<stdio.h>int print_string(const char * str){//00FE18A0 push ebp //00FE18A1 mov ebp,esp //00FE18A3 sub esp,0C0h //00FE18A9 push ebx //00FE18AA push esi //00FE18AB push edi printf("%s\n", str); //00FE18C1 mov eax,dword ptr [str] //00FE18C4 push eax //00FE18C5 push offset string "%s\n" (0FE7B30h) //00FE18CA call _printf (0FE10CDh) //00FE18CF add esp,8 return 1;//00FE18D2 mov eax,1 }int main(){ char* str = "Hello World"; //00FE1865 mov dword ptr [str],offset string "Hello World" (0FE7B34h) print_string(str); //00FE186C mov eax,dword ptr [str] //00FE186F push eax //00FE1870 call _print_string (0FE13B1h) //00FE1875 add esp,4 return 0;//00FE1878 xor eax,eax }
我们再通过一张图来解释一下:
//我们的汇编code如下print_string PROCpush ebp // 保存基址寄存器mov ebp,esp // 堆栈帧基址push ecxpush edx // 保存寄存器mov eac,[ebx+8] // 取堆栈参数..pop edx // 恢复被保存的寄存器pop ecxpop ebp // 恢复基址指针ret // 清除堆栈print_string ENDP
函数print_string() 对应的堆栈帧如下图?
到此,相信大家对“C语言堆栈帧的介绍与创建方式”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341