<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
以上的函數呼叫約定入參都是從右向左,只有PASCAL從左向右
函數呼叫約定不同,會影響函數生成的符號名,函數入參順序,形參記憶體的清理者
在一個檔案中寫_cdecl的函數宣告:
在另一個檔案中寫_stdcall的函數定義:
我們編譯連結一下:
連結器找不到__cdecl sum這個函數呼叫的定義,將宣告的地方改成__stdcall就可以連結成功
形參記憶體還是由呼叫方開闢
ret
表示把棧頂元素的值(呼叫處下一條指令的地址)賦給PC暫存器,並出棧棧頂元素(修改esp)ret 8
表示在ret操作的基礎上,執行執行指令add esp, 8
可以看到在_fastcall呼叫約定中,call指令前面並沒有push操作,而是通過暫存器把實參傳遞到形參(沒有壓棧出棧,速度很快),實參在呼叫方棧幀上,形參在被呼叫方棧幀上
在_fastcall呼叫約定中,最多隻能通過暫存器將最左邊8位元組的實參帶給形參,多於8位元組的實參還是通過push的方式帶給呼叫方的形參
我們給sum傳入三個引數,看看是誰釋放形參記憶體 :
這就很清楚了,一共3個引數,左邊的2個引數通過暫存器傳遞不需要清理記憶體,只有一個形參記憶體需要釋放,所以顯示ret 4
對於sum函數的第一個區域性變數temp,在_cdecl和_stdcall中都是通過ebp-4存取的,形參是通過ebp正向偏移存取,因為形參記憶體在呼叫方的棧幀上
而在_fastcall中是通過暫存器把左邊的8位元組實參帶給sum的形參,並存放在sum函數的棧幀上:
mov edx, dword ptr [ebp-8] mov ecx, dword ptr [ebp-4]
所以對於sum函數的第一個區域性變數temp,只能通過ebp-0Ch存取
對引數個數不確定的,呼叫者清理堆疊,否則被呼叫者清理堆疊
函數的返回值分為內建型別(char、short、int、long、float、double等)、結構體型別、union、enum等
通過eax暫存器帶出
#include <stdio.h> typedef struct { int a; int b; }Data; Data sum(Data a, Data b) { Data temp = { 0 }; temp.a = a.a + b.a; return temp; } int main() { Data a = { 10 }; Data b = {20}; Data ret = { 0 }; ret = sum(a, b); return 0; }
可以看到,4位元組 < 返回值 <= 8位元組時,通過eax和edx暫存器帶出
#include <stdio.h> typedef struct { int a[20]; }Data; Data sum(Data a, Data b) { Data temp = { 0 }; temp.a[0] = a.a[0] + b.a[0]; return temp; } int main() { Data a = { 10 }; Data b = {20}; Data ret = { 0 }; ret = sum(a, b); return 0; }
壓引數的時候,沒有使用push指令,因為暫存器不夠用,故使用了迴圈拷貝的方法,從實參的空間拷貝到形參的空間
產生臨時量有三個地方:函數呼叫前,函數呼叫時return的地方,函數呼叫完成時。在接收大於8位元組返回值時,是在函數呼叫前產生臨時量,並把臨時量記憶體的地址壓棧,而這個臨時量是用來接收返回值的
我們看到不僅僅壓棧了實參a、b,還壓棧了臨時量的地址,可以把sum函數簡單理解為如下形式:
Data sum(void* tmp_address, Data a, Data b);
我們看一下sum函數中return時的組合指令是如何待會80位元組的返回值的
最後通過eax把臨時量的地址帶出來,呼叫函數就可以通過eax拿到sum函數的返回值了
如果臨時量在函數呼叫前產生,那被呼叫函數返回的時候,肯定是通過ebp+8
存取臨時量並寫入返回值。因為ebp指向的空間儲存了呼叫函數的棧底地址,ebp+4指向的空間儲存了call指令下一條指令的地址,ebp+8指向最後一個壓棧的實參,即用於帶出返回值的臨時量的地址
返回方式:
ebp+8
存取該臨時量的地址到此這篇關於C語言函數呼叫約定和返回值詳情的文章就介紹到這了,更多相關C函數呼叫內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45