函数调用过程

因为偶然的机会,工作中同事workshop中讲到了从编译角度理解TI芯片dsp函数的调度过程,主要是函数调度过程中寄存器的使用,这里总结下函数调度过程common的过程。

调用者开始调用函数,1.调用者将函数参数自右向左依次压栈;2.调用者将返回地址压入栈中;3.将寄存器ebp压栈(记录当前调用者栈底指针);4.将esp赋值给ebp(将当前调用者栈顶指针当作该函数的栈底指针);5.编译器会依次将函数内局部变量压栈;6。执行调用结束后,依次将局部变量出栈,恢复ebp;7.返回值地址出栈,程序计数器(PC)指向该地址,回到调用者调用位置,继续执行。

栈图如下:

时间: 2024-09-30 09:39:28

函数调用过程的相关文章

函数调用过程&生成器解释

摘自马哥解答,感谢. 函数调用过程: 假设程序是单进程,单执行流,在某一时刻,能运行的程序流只能有一个.但函数调用会打开新的执行上下文,因此,为了确保main函数可以恢复现场,在main函数调用其它函数时,需要先把main现场保存下来,放一边,即栈中.这时候,被调用函数即可执行,且完成后,可加到调用者Main.“回到”调用者main,main就可以继续向后运行. 函数调用可嵌套运行,例如,X --> Y --> Z, 在Z返回后,Y方可继续,并直到返回,接着X才能继续, 并直到结束.此场景中,

c函数调用过程原理及函数栈帧分析

转载自地址:http://blog.csdn.net/zsy2020314/article/details/9429707       今天突然想分析一下函数在相互调用过程中栈帧的变化,还是想尽量以比较清晰的思路把这一过程描述出来,关于c函数调用原理的理解是很重要的. 1.关于栈 首先必须明确一点也是非常重要的一点,栈是向下生长的,所谓向下生长是指从内存高地址->低地址的路径延伸,那么就很明显了,栈有栈底和栈顶,那么栈顶的地址要比栈底低.对x86体系的CPU而言,其中 ---> 寄存器ebp(

C++函数调用过程深入分析<转>

转自http://blog.csdn.net/dongtingzhizi/article/details/6680050 C++函数调用过程深入分析 作者:靠谱哥 微博:洞庭之子-Bing 0. 引言 函数调用的过程实际上也就是一个中断的过程,那么C++中到底是怎样实现一个函数的调用的呢?参数入栈.函数跳转.保护现场.回复现场等又是怎样实现的呢?本文将对函数调用的过程进行深入的分析和详细解释,并在VC 6.0环境下进行演示.分析不到位或者存在错误的地方请批评指正,请与作者联系. 首先对三个常用的

深入理解C语言的函数调用过程 【转】

转自:http://blog.chinaunix.net/uid-25909619-id-4240084.html 原文地址:深入理解C语言的函数调用过程 作者:wjlkoorey258 本文主要从进程栈空间的层面复习一下C语言中函数调用的具体过程,以加深对一些基础知识的理解.    先看一个最简单的程序: 点击(此处)折叠或打开 /*test.c*/ #include <stdio.h> int foo1(int m,int n,int p) { int x = m + n + p; ret

ARM系统中函数调用过程中的参数传递-转

在 嵌入式软件编程中,经常会用到函数调用,之前在学习如何在C语言中嵌入汇编时有了解到C语言之前的参数调用是使用寄存器R0传递第一个参数,R1传递到第 二个..一直到R3传递第四个参数.但是实际上有时可能传递的参数非常多,超过8个,或是参数中有浮点数之类,参数也会超过4个寄存器,对于超出的部份并 不使用R4,而是使用堆栈的方式,但具体是如何的方式很多网站就没了下文了. 对于ARM体系来说,不同语言撰写的函数之间相互调用(mix calls)遵循的是 ATPCS(ARM-Thumb Procedur

(转)函数调用过程探究

转自:http://www.cnblogs.com/bangerlee/archive/2012/05/22/2508772.html 引言 如何定义函数.调用函数,是每个程序员学习编程的入门课.调用函数(caller)向被调函数(callee)传入参数,被调函数返回结果,看似简单的过程,其实CPU和系统内核在背后做了很多工作.下面我们通过反汇编工具,来看函数调用的底层实现. 基础知识 我们先来看几个概念,这有助于理解后面反汇编的输出结果. 栈(stack) 栈,相信大家都十分熟悉,push/p

09 js函数调用过程内存分析、js函数细节

函数的调用过程 Js函数调用过程的内存分析. 一个递归调用的例子: <html> <head> <script> //abc是一个函数它接收一个数值 function abc(num1){ if (num1>3) { abc(--num1); //递归 } document.writeln(num1); } abc(5); </script> </head> <body> </body> </html>

函数调用过程栈帧变化详解

http://www.cnblogs.com/fxplove/articles/2574451.html 数调用另一个词语表示叫作 过程.一个过程调用包括将数据和控制从代码的一部分传递到另一部分.另外,它还必须在进入时为过程的局部变量分配空间,并在推出时释放这些空间.而数据传递,局部变量的分配和释放通过操纵程序栈来实现.在了解本文章之前,您需要先对程序的进程空间有所了解,即对进程如何使用内存?如果你知道这些,下面的内容将是很easy的事情了.为了您的回顾还是将简单的分布图贴出来,便于您的回顾.

栈溢出笔记1.1 函数调用过程

选择从栈溢出开始学习Shellcode的编写,是因为在没有保护机制(栈Cookie,ASLR,DEP,SafeSEH)的系统中使用栈溢出是一件很简单的事情.栈区随着函数调用动态变化,每个函数调用时在栈上占用的空间称为栈帧.用一个示例来说明栈上保存的内容及动态变化的过程. 下面是一个程序,生成一个对话框显示一条"Hello World!"消息.下面是该程序的C代码: 在VS2008中用Debug版编译之后,拖入Immunity Debugger中: 图1 example_1.exe入口点

《驱动调试 - 根据oops的栈信息,确定函数调用过程》

1.上章的oops栈信息如下图所示: 9fe0: 代表最初的栈顶SP寄存器位置 9e80:代表函数出错的SP寄存器位置 2.我们先来分析上图的栈信息,又是怎样的过程呢? 2.1内核主要是通过STMDB和LDMIA汇编命令来入栈和出栈 (STMDB和LDMIA汇编命令参考: http://www.cnblogs.com/lifexy/p/7363208.html) 内核每进入一个函数就会通过STMDB,将上个函数的内容值存入栈顶sp,然后栈顶sp-4. 当内核的某个函数出问题时,内核便通过LDMI