在出棧函式的形參 5分鐘讓你知道c語言的函式呼叫

2021-10-18 08:02:22 字數 2194 閱讀 6526

前言

c語言的函式呼叫內容主要有函式中的形參,函式的返回值,函式中呼叫之前的工作,函式呼叫之後的工作,函式引數的傳遞。

第一分鐘:函式的形參

形式引數是在函式定義中使用的引數叫形式引數,形式引數可以沒有,可以是指標,可以是結構體,可以是數值, 可以是聯合體等。

例如整數形參arg

void func (int arg) {}

形參是整形指標

void func (int *parg) {}

形參是結構體指標

typedef structstructname; 

void func (structname *parg) {}

形參是空型別

void func (void){}

形參是聯合體指標

typedef enumenumename ; 

void func (enumename *parg) {}

形參的個數就是實行引數的數量,每乙個形參之間用逗號隔開,如下

void func (int arg1, int arg2) {}

可變形參是在c99中的擴充套件的,用...表示其他的引數,但是需要在函式前包含標頭檔案,這個檔案中包含了va_list.

void func (int arg, ...)

返回值為int 型的函式

int func (void) {

int arg = 0;

return arg ;

返回值為指標型別的函式

int* func (void) {

int *parg = null;

return parg ;

第三分鐘:函式的呼叫之前

在函式呼叫之後,以ms-51為例講解該過程。

函式沒有引數的

沒有引數的函式呼叫就只用乙個lcall指令跳轉到函式的位址0b01h

2.函式有引數的

在keil中使用兩個暫存器來儲存函式指標,具體的型別和引數怎麼分配暫存器如下圖所示。第乙個函式指標:led_long_update用r6 r7傳遞;最右邊的1使用位定址區來儲存;第三個引數2000 使用r3 r2傳遞;第4個引數0使用r5和r4傳遞。

把暫存器的放在棧中,當r7-r4都使用了,其他的引數採用間接定址,如紅框中框起來的那樣傳遞引數。

執行上面函式前

傳遞引數後

第四分鐘:函式呼叫之後

在函式呼叫之後,以ms-51為例講解該過程。

函式沒有返回值

函式有返回值

函式返回值傳遞見下表 ,演示的這個函式返回值乙個位元組,使用r7來返回

第五分鐘:中斷函式引數的傳遞

中斷函式呼叫的時,有保護現場,即儲存acc 、b 、dptr 和 r0-r7使用的那組暫存器和psw(程式狀態機暫存器),把這些通過push儲存在棧中。

中斷退出的時,恢復現場,依次恢復之前壓棧的,出棧和入棧的順序相反,filo(先進後出),如下圖所示。

5分鐘讓你知道什麼是PKI

public key infrastructure pki 中文叫做公開金鑰基礎設施,也就是利用公開金鑰機制建立起來的基礎設施。但是如果這麼解釋起來,到底是個什麼東西,大家想必是沒辦法理解的。現在大家的很多重要活動都是通過網路進行的,那麼與之俱來的安全問題就顯得非常重要。同時很多安全保障機制都是基於...

5分鐘讓你的牙齒blingbling讓牙齒

很多人認為,多刷幾次牙,多嚼幾顆口香糖就可以解決。no!單靠刷牙並不能徹底清潔口腔,特別是牙齒。好吧,下面將介紹幾種方法,讓你的牙齒迅速潔淨,並且是徹底性的。方法一材料 士多啤梨一顆,發酵粉1 2茶匙。使用方法 將士多啤梨碾成糊狀,與發酵粉充分混合,用乙個柔軟的牙刷將混合物均勻塗在牙齒表面,5分鐘後...

互動教程,讓你5分鐘掌握 Flexbox 布局模式

flexbox 布局模組目前是 w3c 候選標準,旨在提供乙個更有效的方式進行布局,對齊和為容器裡的專案分配空間,即使它們的大小是未知的或者動態的。這裡分享乙個基於 knockout.js 構建的互動教程,讓你5分鐘就掌握 flexbox 布局模式。真是好東西!13種非常動感的頁面載入動畫效果 你見...