栈帧,也就是stack frame,其本质就是一种栈,只是这种栈专门用于保存函数调用过程中的各种信息(参数,返回地址,本地变量等)。栈帧有栈顶和栈底之分,其中栈顶的地址最低,栈底的地址最高,SP(栈指针)就是一直指向栈顶的。在x86-32bit中,我们用 ebp 指向栈底,也就是基址指针;用 esp 指向栈顶,也就是栈指针。
14.可以看到函数fun的数据 形参a,b 在上一层函数的栈中. 一部分在自己的栈上. 此步取值到加法器中进行加法运算,再赋值给c 15.c赋给返回值,填入上面的留空位置 16.栈底恢复上一层 17.lr赋值给pc, 实现了跳转 18.返回值赋值给全局变量m 19.前面函数调用的形参已经无用,回滚sp 20.函数返回,清理main的栈...
* 活动函数会把局部变量和一些寄存器里面的值入栈(而不是寄存器的地址入栈,因为寄存器的地址就是通过宏定义为ebx等等名字了,也就是寄存器地址已经公之于众的了,关于这个具体可以看我这篇文章详细讲解,嵌入式微处理器结构和上电启动到开始运行程序的过程讲解),因为整个cpu只有这么一组寄存器,但是函数调用却可以有很多...
call指令是调用子程序,后面紧跟的应该是子程序名或者过程名。 代码语言:javascript 复制 004018F2E8BDF7FFFFcall_Add(04010B4h) 下面图片就是call指令执行后的结果,压栈的操作,可以通过监视窗口,观察esp的地址变化来看 10.ret 用于终止当前函数的执行,将运行权交还给上层函数。也就是,当前函数的帧将被回收。 并且...
传递给foo的参数被压到栈中,最后一个参数先进栈,所以第一个参数是位于栈顶的。foo中声明的局部变量以及函数执行过程中需要用到的一些临时变量也都存在栈中。 小于等于4个字节的返回值会被保存到EAX中,如果大于4字节,小于8字节,那么EDX也会被用来保存返回值。如果返回值占用的空间还要大,那么调用者会向被调用者传...
C函数调用机制与栈帧原理详解-当一个C函数被调用时,函数的参数如何传递、堆栈指针如何变化、栈帧是如何被建立以及如何被消除的,一直缺乏系统性的理解,因此决定花时间学习下函数调用时整个调用机制并总结成文,以便加深理解。本文将从汇编的角度讲解函数调用时,堆栈的变
2.进入被调用函数的准备 40050a~40050f两条指令为函数调用传递参数的过程,我们可以看到是函数参数是倒序传入的:先传入第N个参数,再传入第N-1个参数。(注意,目前64位的机器上,函数参数的传递很少是通过栈进行的。) 接下来的三行汇编,对应的是实参的传递和对foo函数的调用。下面,我们接着执行几条汇编(si 3),进...
1)数据结构(尤其是栈)应该尽可能地在自然边界上对齐。2)原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。 142.函数调用过程栈的变化,返回值和参数变量哪个先入栈? 1、调用者函数把被调函数所需要的参数按照与被调函数的形参顺序相反的顺序压入栈中,即:从右向左依次...
在函数调用之前通过上文介绍的寄存器存储参数,函数返回之前通过RAX寄存器(32位系统为EAX)存储返回结果。 另外一个比较重要的知识点是函数调用过程中与堆栈相关的寄存器RSP和RBP,两个寄存器主要实现对栈位置的记录,具体作用如下: RSP:栈指针寄存器(reextended stack pointer),其内存放着一个指针,该指针永远指向系统栈最...