www.365zg.com
作者:线上365bet正网 发布时间:2019-11-04 阅读:
全部展开 什么是一堆又一堆? 用c / C ++编译的程序占用的内存分为以下几部分:1.电池(堆栈):由编译器自动分配,例如功能保存参数值,局部变量值等。 就像数据结构堆栈一样工作。 2,堆(heap):通常由程序员释放,如果程序员不释放,操作系统可以回收程序。 请注意,它与数据结构堆不同。该分配类似于链接列表eh,eh。 3,全局区域(static area)(静态)-全局变量和静态变量存储在块中,已初始化的全局变量和静态变量位于该区域中,全局未初始化的变量和静态变量没有被相位附近的其他区域初始化。 -程序4结束后有一个系统版本。常量常量区域:常量字符串位于此处 它在程序5,程序代码区和功能体二进制代码结束后由系统启动。 什么是函数栈? 函数堆栈的本质是链接到汇编语言的参数步骤。 汇编语言过程可以看作是对两个数字之和进行简单计算的函数。如果使用程序集创建,则估计为subprocpopax。从堆栈中获取a并将其放置在AX popbx寄存器中。从电池中取出b并将其放入BX寄存器addax bx中。+ bret //返回subendp的计算显然要调用此函数,因此我们需要先将值b插入堆栈,然后在堆栈前进时按它。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。 ![]() |