導航:首頁 > 操作系統 > 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調用棧相關的資料

熱點內容
穿越抗戰時期送物資的小說 瀏覽:535
大轉折系列電影17部 瀏覽:86
蠟筆小新功夫小子國語版免費觀看 瀏覽:407
一個囚犯和一個小男孩的外國電影 瀏覽:974
yy寫的很詳細的小說 瀏覽:128
求個在線觀看的中文字幕 瀏覽:436
四台伺服器怎麼改成host 瀏覽:784
馬尾電影院今日影訊 瀏覽:815
老濕機免費看片網站 瀏覽:914
ck影院 瀏覽:942
ubuntuphpfpm安裝 瀏覽:414
末世之一女多男 瀏覽:178
電腦上如何下載稅務app 瀏覽:528
s曲線單片機 瀏覽:664
配音秀app如何自動取消續費功能 瀏覽:755
程序員深山養雞 瀏覽:825
類似渣夫的百惠媳的小說 瀏覽:502
javaforever 瀏覽:637
女主叫桃子的微電影 瀏覽:449
藍光超清1080p影視 瀏覽:296