导航:首页 > 操作系统 > androidc调用栈

androidc调用栈

发布时间:2023-02-05 10:38:21

㈠ c语言栈调用

定义局部变量也可以调用栈空间。也就是在定义是加个{ }

{
int i=0;
i++;
}

㈡ c语言怎么调用栈函数

给你个例子:

#include
//写好加法,以便调用
int sum(int x1,int x2)
{
int x3=x1+x2;
return x3;
}
void main()
{
int a=0;
int b=0;
int c=0;
printf("请输入两个整数\n");
scanf("%d%d",&a,&b);
c=sum(a,b);//传递参数给sum()函数,返回他们的和
printf("%d+%d的和是:%d\n",a,b,c);
}

总之:就是你把一种方法写到单独的块,这里就是sum()函数,执行一个单一的功能,在main函数调用就是了!

㈢ C语言函数调用栈

程序的执行过程可看作连续的函数调用。当一个函数执行完毕时,程序要回到调用指令的下一条指令(紧接call指令)处继续执行。函数调用过程通常使用堆栈实现,每个用户态进程对应一个调用栈结构(call stack)。编译器使用堆栈传递函数参数、保存返回地址、临时保存寄存器原有值(即函数调用的上下文)以备恢复以及存储本地局部变量。

不同处理器和编译器的堆栈布局、函数调用方法都可能不同,但堆栈的基本概念是一样的。

寄存器是处理器加工数据或运行程序的重要载体,用于存放程序执行中用到的数据和指令。因此函数调用栈的实现与处理器寄存器组密切相关。

AX(AH、AL):累加器。有些指令约定以AX(或AL)为源或目的寄存器。输入/输出指令必须通过AX或AL实现,例如:端口地址为43H的内容读入CPU的指令为INAL,43H或INAX,43H。目的操作数只能是AL/AX,而不能是其他的寄存器。 [5]

BX(BH、BL): 基址寄存器 。BX可用作间接寻址的地址寄存器和 基地址寄存器 ,BH、BL可用作8位通用数据寄存器。 [5]

CX(CH、CL):计数寄存器。CX在循环和串操作中充当计数器,指令执行后CX内容自动修改,因此称为计数寄存器。 [5]

DX(DH、DL):数据寄存器。除用作通用寄存器外,在 I/O指令 中可用作端口 地址寄存器 ,乘除指令中用作辅助累加器。 [5]

2.指针和 变址寄存器

BP( Base Pointer Register):基址指针寄存器。 [5]

SP( Stack Pointer Register): 堆栈指针寄存器 。 [5]

SI( Source Index Register):源变址寄存器。 [5]

DI( Destination Index Register):目的变址寄存器。 [5]

函数调用栈的典型内存布局如下图所示:

图中给出主调函数(caller)和被调函数(callee)的栈帧布局,"m(%ebp)"表示以EBP为基地址、偏移量为m字节的内存空间(中的内容)。该图基于两个假设:第一,函数返回值不是结构体或联合体,否则第一个参数将位于"12(%ebp)" 处;第二,每个参数都是4字节大小(栈的粒度为4字节)。在本文后续章节将就参数的传递和大小问题做进一步的探讨。 此外,函数可以没有参数和局部变量,故图中“Argument(参数)”和“Local Variable(局部变量)”不是函数栈帧结构的必需部分。
其中,主调函数将参数按照调用约定依次入栈(图中为从右到左),然后将指令指针EIP入栈以保存主调函数的返回地址(下一条待执行指令的地址)。进入被调函数时,被调函数将主调函数的帧基指针EBP入栈,并将主调函数的栈顶指针ESP值赋给被调函数的EBP(作为被调函数的栈底),接着改变ESP值来为函数局部变量预留空间。此时被调函数帧基指针指向被调函数的栈底。以该地址为基准,向上(栈底方向)可获取主调函数的返回地址、参数值,向下(栈顶方向)能获取被调函数的局部变量值,而该地址处又存放着上一层主调函数的帧基指针值。本级调用结束后,将EBP指针值赋给ESP,使ESP再次指向被调函数栈底以释放局部变量;再将已压栈的主调函数帧基指针弹出到EBP,并弹出返回地址到EIP。ESP继续上移越过参数,最终回到函数调用前的状态,即恢复原来主调函数的栈帧。如此递归便形成函数调用栈。

EBP指针在当前函数运行过程中(未调用其他函数时)保持不变。在函数调用前,ESP指针指向栈顶地址,也是栈底地址。在函数完成现场保护之类的初始化工作后,ESP会始终指向当前函数栈帧的栈顶,此时,若

㈣ c语言如何将函数调用堆栈打印出来

可以直接用输出在函数内部调用时,把调用顺序打印出来。

一、一个由C/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。-程序结束后有系统释放

4、文字常量区—常量字符串就是放在这里的。程序结束后由系统释放

5、程序代码区—存放函数体的二进制代码。


二、例程:

//main.cpp
inta=0;全局初始化区
char*p1;全局未初始化区
main()
{
intb;栈
chars[]="abc";栈
char*p2;栈
char*p3="123456";123456在常量区,p3在栈上。
staticintc=0;全局(静态)初始化区
p1=(char*)malloc(10);
p2=(char*)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1,"123456");123456放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}

㈤ C语言栈的调用。

可以。
使用STL的stack,例如:
#include<cstdio>
#include<stack>
using namespace std;
stack<int>s;
int main()
{
int a;
scanf("%d",&a);
getchar();
s.push(a);
printf("%d\n",s.top());
s.pop();
getchar();
return 0;
}
另外,这是C++,C标准库没有STL。
----
以下关于stack的成员,抄自MSDN:
Constructors
stack
Constructs a stack that is empty or that is a of a base container object.

Typedefs
container_type
A type that provides the base container to be adapted by a stack.

size_type
An unsigned integer type that can represent the number of elements in a stack.

value_type
A type that represents the type of object stored as an element in a stack.

Member Functions
empty
Tests if the stack is empty.

pop
Removes the element from the top of the stack.

push
Adds an element to the top of the stack.

size
Returns the number of elements in the stack.

top
Returns a reference to an element at the top of the stack.

㈥ c函数调用堆栈问题

第一个函数返回的是字串常量的地址。当第二次调用的时候,显然可能会变。而且您这个我觉得不太安全。虽然返回的是字串常量的地址,你怎么保证该函数运行完毕,这个常量还在呢?我是很怀疑的。

后面那个time是外部变量的地址,是传进来的。而在函数体内,只是改变了外部变量的字符串。本身的地址是没有改变的。这个就没有问题了。

㈦ C语言栈的调用。

程序中,一个函数是一个过程,这个过程可以分为包括传入参数、过程代码、返回三部分构成。由于一个函数过程需要用到内部变量、临时变量等,所以需要在进程空间的栈空间分配一段存储片段来存储函数过程中的这些参数,该内存片段即为栈帧。
栈帧的由来:
为一个函数的过程提供一个存储函数局部变量,参数,返回地址和其他临时变量;
栈帧的周期:
进入函数~函数返回,该阶段内栈帧作为
不同的语言具体的实现方式略有不同,但是,总体上,fun(a,b);
局部变量:
包括函数传入的形参和函数内部定义的变量;
返回地址:
指令指针p指向call
fun,那么fun栈帧存储的返回地址为p+1;现今的编译器的一个约定是将返回地址存到一个固定的寄存器中,这样比读取栈帧(内存)效率要高。
临时变量:
主要为计算,运算过程中的中间临时变量;
参数传递:
其一:如果fun中调用另一个函数k(a,b...n);那么,传递的参数是形参,按照现代编译规定,前k个形参是通过寄存器传递,后n-k个形参通过栈帧的实参部分(栈帧的尾部)来传递;
其二:主要为在fun中要调用函数g(&a,&b),那么为g()函数传出实参(形参是通过寄存器来传递的)是通过“传出实参”区块进行的,这么做主要是为了保证该实参能够被内层嵌套的函数访问。比如,g函数由调用一个k(a地址)函数,同样需要用到a的地址,所以fun在传递参数时必须为实参(&a)传递申请固定的内存存储空间(而非用寄存器)这样k函数可以通过固定的内存地址(fun的形参列表来获取参数值)。这时的g的栈帧为fun栈帧的下一帧(相邻的空间地址),即调用者和被调用者的栈帧是相连的;
保护的寄存器:
栈帧作为函数过程的一个临时内存存储区块,同时负责函数调用过程中寄存器值的保存和还原。即:假设fun函数目前占用了寄存器ri存储一个临时变量t,而此时调用了函数g(),在g()函数中可能需要用到寄存器ri做运算的临时存储,那么如何确保g()函数调用返回后,ri恢复到fun中t的原来值。这就需要在调用者或者被调用者中选择其一来保存原有ri的值,即caller-save或者callee-save。

阅读全文

与androidc调用栈相关的资料

热点内容
女星走光电影 浏览:132
恐怖鬼电影免费观看 浏览:475
更新最快的影院 浏览:505
电影院办的卡可以在网上消费电影吗 浏览:835
主角专门抢别人老婆的都市小说 浏览:292
啄木鸟女星电影 浏览:866
c语言编程源码下载工具 浏览:781
儿女传奇电影系列 浏览:593
武平废品回收小程序源码 浏览:273
工作者迷失1963电影 浏览:703
余美颜摩登情书txt 浏览:819
linux命令大全完整版 浏览:829
单片机画电路图用什么软件好 浏览:108
phpfpm工作原理 浏览:421
加密u盘定制哪家好 浏览:947
如何将视频做成动态表情包安卓 浏览:964
外置打印服务器是什么 浏览:321
加密电脑钱包 浏览:693
javastring编程题 浏览:796