衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

來聊聊函數是怎么傳入參數的

Q4MP_gh_c472c21 ? 來源:未知 ? 作者:李倩 ? 2018-07-05 15:57 ? 次閱讀

今天,我們來聊聊函數是怎么傳入參數的,我們都知道,當一個函數調用使用少量參數(ARM上是少于等于4個)時,參數是通過寄存器進行傳值(ARM上是通過r0,r1,r2,r3),而當參數多于4個時,會將多出的參數壓入棧中進行傳遞(其實在函數調用過程中也會把r0,r1,r2,r3傳遞的參數壓入棧),具體是什么實現的呢,下面我們來具體看看。

函數棧

首先我們需要了解一下linux下一個進程的內存地址空間是如何布局的,在linux中,0~3G的虛擬地址為進程所有,3G~4G由內核所使用,每一個進程都有自己獨立的0~3G內存地址空間。當進程進行函數調用時,我們都知道傳入被調用函數的參數是通過棧進行操作的,這里我們只需要簡單了解一下linux的內存地址空間中的棧是自頂向下生長的,就是棧底出于高地址處,棧頂出于低地址處。

好的,簡單了解了內存地址空間的棧后,我們還需要簡單了解一下EBP和ESP這兩個寄存器,EBP是用保存棧低地址的,而ESP用于保存棧頂地址,而每一次函數調用會涉及到一個棧幀,棧幀結構如下圖

舉個實例詳細說明一下一個函數幀的特點,比如

/* B被A調用

* 參數:data1, data2, data3

* 局部變量: s1, s2, s3 */

void B (int data1, int data2, int data3)

{

int b_s1;

int b_s2;

int b_s3;

}

/* A調用B函數 */

void A (void)

{

int a_s1;

int a_s2;

int a_s3;

B (1, 2, 3);

printf ("1\n");

}

在以上例子中棧幀情況應該如下圖所示

從圖例中可以看出,當A函數沒有調用B函數時,A函數的棧幀只保存著局部變量,而EBP(棧底指針)指向的是A函數的函數棧幀頭,而當A函數調用B函數時,A函數會將B函數所需要的參數從右往左壓入棧(在例子中先壓入3,之后是2,最后是1),之后會將A調用完B之后所需要運行的第一條指令壓入棧,此時建立一個B的棧幀,具體流程:

從右往左將B函數所需參數壓入棧

壓入執行完B函數之后的第一條指令地址

建立B棧幀

壓入A棧幀的棧底

壓入B函數保護的寄存器

壓入B函數的局部變量

小結

其實每一種處理器架構所使用的方式都不一樣,在arm上我幾個參數和不定參數的情況通過匯編代碼查看又不相同,今天講的就當做一個入門知識吧。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5363

    瀏覽量

    121178
  • Linux
    +關注

    關注

    87

    文章

    11345

    瀏覽量

    210402
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62977

原文標題:你知道ARM下函數是怎么傳入參數的嗎?

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    keil rtx重入函數無法正常傳入該怎么辦?

    使用KEIL C51然后用到RTX,然后多任務需要同時調用A函數,這個A函數帶有一個參數我在函數上加入了reentrant關鍵字就是為了可以重入,現在的問題是當任務調用A
    發表于 10-23 23:19

    labview調用halcon程序如何傳入參數?

    各位大神,labview調用halcon的hdev程序時,如何給halcon傳入參數?比如傳入圖像,labview如何獲取這個傳入參數的接口
    發表于 05-12 22:43

    U16的數據在傳入函數之后為什么會被置零

    原本U16的數據,傳入函數之后變成U8了,高8位被置零了。后發現罪魁禍首,函數定義和函數聲明時參數給定的長度不一,最后統一更改為U16之后,
    發表于 07-14 06:41

    不定參數個數的函數如何定義的呢

    在學習使用C語言的時候都會告知main函數是可以接入多個參數的,那么問題來了,不定參數個數的函數如何定義的呢,它是否可以在單片機中使用呢定義和使用//首先引用#include //定義
    發表于 07-15 07:23

    在CH579上移植rtthread并使用藍牙功能,請問傳入Peripheral_TaskID參數的意義是什么?

    大家好,我現在嘗試在CH579上移植rtthread并使用藍牙功能。移植過程中發現啟動設備需要用到GAPRole_PeripheralStartDevice函數。但是這個函數必須傳入
    發表于 08-26 06:15

    程序調試時如何實時傳入命令參數?

    程序調試時如何實時傳入命令參數
    發表于 10-25 08:25

    學會在Linux下使用getopt函數來獲取傳入參數

    在linux下有一個函數叫getopt就可以寫成-r -l -i 的形式,下面是一個使用openssl通信的程序,需要4個參數服務器ip -i、服務器端口-p、證書地址-c、私匙地址-s代碼如下,重點看while循環
    發表于 05-06 17:17 ?1185次閱讀

    基于Simulink搭建保護原型函數

    BMS保護包括過充保護、過流保護、高溫保護等等保護類型較多,但是如果用函數封裝的角度去理解,大多數保護類型函數原型是一樣的,只不過傳入函數參數
    的頭像 發表于 03-10 14:38 ?937次閱讀
    基于Simulink搭建保護原型<b class='flag-5'>函數</b>

    函數參數

    對比功能塊,函數沒有任何他們保存參數值的內存。在函數激活時,本地數據只中臨時地貯存。由于這個原因,當調用函數時,所有在函數聲明部分定義的形式
    的頭像 發表于 04-27 15:26 ?629次閱讀
    <b class='flag-5'>函數</b>的<b class='flag-5'>參數</b>

    Python 函數參數分類

    今天給大家分享一下自己整理的一篇 Python 參數的內容,內容非常的干,全文通過案例的形式理解知識點,自認為比網上 80% 的文章講的都要明白,如果你是入門不久的 python 新手,相信本篇
    的頭像 發表于 10-21 10:45 ?883次閱讀

    函數類型和函數指針類型的區別

    平時用的更多的是函數指針類型,比如作為函數參數傳入回調函數等等。實際上函數類型也是可以作為
    發表于 10-24 14:27 ?424次閱讀

    函數參數的分類有哪些

    一、函數參數的分類 函數參數分為兩類:形參 及 實參 形參:形參是在創建過程中聲明的參數,如果不給形參
    的頭像 發表于 11-14 11:13 ?2824次閱讀

    input結果如何傳入參數

    當我們談論輸入結果傳入參數時,可以理解為我們需要將某個結果作為參數傳遞給一個函數或者算法,以便對其進行進一步的處理或分析。這樣做通常是為了提高代碼的復用性、靈活性以及整體的效率。 在編
    的頭像 發表于 11-30 10:07 ?846次閱讀

    python函數的萬能參數

    我們通過一個簡單的事例展示一下函數的萬能參數,我們先寫一個最簡單的函數
    的頭像 發表于 07-17 14:56 ?385次閱讀
    python<b class='flag-5'>函數</b>的萬能<b class='flag-5'>參數</b>

    聊聊std::move函數和std::forward函數

    今天我們聊聊Modern cpp的兩個非常重要的概念移動語義和轉發引用。
    的頭像 發表于 11-05 16:58 ?387次閱讀
    卢克索百家乐官网的玩法技巧和规则 | 金沙百家乐官网现金网| 米兰国际娱乐城| 卓尼县| 新绛县| bet365v网卡| 六合彩特码开奖| 永吉县| E乐博百家乐官网娱乐城| 362百家乐官网的玩法技巧和规则| 涂山百家乐官网的玩法技巧和规则| 全景网百家乐官网的玩法技巧和规则| 百家乐官网真人游戏| 百家乐全自动分析软件| 姚记百家乐的玩法技巧和规则| 大发8888| bet365娱乐在线| 百家乐官网玩法的秘诀| 尊龙百家乐官网娱乐场| 百家乐现金网排名| 百家乐电子路单谁| 大发888wofacai官网| 中信娱乐城| 菲律宾百家乐官网太阳城| 属猪的人做生意摆放什么聚财| 百家乐出老千视频| 大发888游戏破解软件| 六合彩结果| 百家乐官网小音箱| 三国百家乐官网娱乐城| 百家乐任你博娱乐场开户注册| 大发888中文下载| 武乡县| 伯爵百家乐官网的玩法技巧和规则| 百家乐出庄几率| 大发888注册bet| 帝王百家乐官网全讯网2| 立即博百家乐官网的玩法技巧和规则| 百家乐必学技巧| 大发888-dafa888uk.com| 百家乐官网如何投注技巧|