主页 > 365betvip > 什么是一堆又一堆?什么是函数栈?
什么是一堆又一堆?什么是函数栈?
发布日期:2019-10-04 20:44 浏览次数: 作者:365bet手机在线
全部展开
什么是一堆又一堆?
用c / C ++编译的程序占用的内存分为以下几部分:1.堆(stack):编译器自动分配和保存的函数的参数值,局部变量值等。
就像数据结构堆栈一样工作。
2,堆(heap):通常由程序员启动,如果程序员没有启动,操作系统可以回收程序。
请注意,它与数据结构中的堆不同。该分配类似于链接列表eh,eh。
3,全局区域(static area)(静态)-全局变量和静态变量存储在块中,已初始化的全局变量和静态变量位于该区域中,全局未初始化的变量和初始值静态可变相位附近的另一个区域,未被数字化。
-程序4结束后将有一个系统版本。常量常量区:常量字符串位于此处。
它在程序5,程序代码区和功能体二进制代码结束后由系统启动。
什么是函数栈?
函数堆栈的本质是链接到汇编语言的参数步骤。
汇编语言过程可以理解为一种函数,例如简单地计算两个数字之和。如果要使用程序集创建报价,请使用Subprocpopax。从堆栈中获取a并将其放置在AX popbx寄存器中。从电池中取出b并将其放入BX寄存器addax bx中。+ bret //返回subendp的计算显然要调用此函数,因此我们需要先将值b插入堆栈,然后在堆栈前进时将其压入。因此以这种方式调用程序集,例如4 + 5 push5计算。push4; callsub; // AX返回值在此示例中,按5或预按4不会更改结果,但是如果参数顺序错误,大多数程序将使用任何高级语言。不是灾难性的,它需要用汇编语言进行编译,机器语言也是下面的程序C,它计算值a + b,不可避免地是先前的汇编代码intsub(inta,intb){returnna +用b;}编译,并由C调用。此Sub函数需要压入堆栈(即,传递参数),但是C中的这些作业不需要完成。
只需写下(7.9)。在程序集中进行编译时,编译器会自动完成相关的插入作业。
根据函数调用方式和参数插入顺序,当前有三个规则。stdcallcdeclfastcall与堆栈顺序和堆栈清洁作业有关。堆栈中的stdcall函数必须通过调用方清除cdecall堆栈来清除默认函数调用模式。C栈。因此,C支持快速调用变量参数,并将函数参数列表的前三个参数放在eax,edx,ecx和其他寄存器中。参数堆栈源代码:intfunction(inta,intb){returnna + b;}voidmain(){function(10,20);}1。
__cdecl_functionpushebpmovebp,espmoveax,[ebp + 8];参数1addeax,[ebp + C];另外,2popebpretn_mainpushebpmovebp参数,esppush14h;call_function函数的参数1。称为addesp函数。
__fastcall @ function @ 8pushebpmovebp,esp;从堆栈指针中保存subsp,8。添加两个局部变量mov[ebp-8],edx。保存参数2mov[ebp-4],ecx。保存参数1moveax,[ebp-4];参数1addeax,[ebp-8];加上2movesp参数,ebp;修改后的堆栈popebpretn_mainpushebpmovebp,espmovedx,14h。EDXmovecx的参数2,0Ah。ECXcall @函数@ 8的参数1。调用xoreax和eaxpopebpretn3函数。
__stdcall_function @ 8pushebpmovebp,espmoveax,[ebp];参数1addeax,[ebp + C];加上2popebpretn8参数。修复stack_mainpushebpmovebp,esppush14h。参数2 push push0Ah; call_functionb堆栈的参数1。