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

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

3天內不再提示

來聊聊函數(shù)是怎么傳入?yún)?shù)的

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

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

函數(shù)棧

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

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

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

/* B被A調用

* 參數(shù):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函數(shù) */

void A (void)

{

int a_s1;

int a_s2;

int a_s3;

B (1, 2, 3);

printf ("1\n");

}

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

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

從右往左將B函數(shù)所需參數(shù)壓入棧

壓入執(zhí)行完B函數(shù)之后的第一條指令地址

建立B棧幀

壓入A棧幀的棧底

壓入B函數(shù)保護的寄存器

壓入B函數(shù)的局部變量

小結

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

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

    關注

    31

    文章

    5268

    瀏覽量

    119646
  • Linux
    +關注

    關注

    87

    文章

    11161

    瀏覽量

    208462
  • 函數(shù)
    +關注

    關注

    3

    文章

    4256

    瀏覽量

    62223

原文標題:你知道ARM下函數(shù)是怎么傳入?yún)?shù)的嗎?

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

收藏 人收藏

    評論

    相關推薦

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

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

    labview調用halcon程序如何傳入參數(shù)

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

    U16的數(shù)據(jù)在傳入函數(shù)之后為什么會被置零

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

    不定參數(shù)個數(shù)的函數(shù)如何定義的呢

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

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

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

    程序調試時如何實時傳入命令參數(shù)?

    程序調試時如何實時傳入命令參數(shù)
    發(fā)表于 10-25 08:25

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

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

    基于Simulink搭建保護原型函數(shù)

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

    函數(shù)參數(shù)

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

    Python 函數(shù)參數(shù)分類

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

    函數(shù)類型和函數(shù)指針類型的區(qū)別

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

    函數(shù)參數(shù)的分類有哪些

    一、函數(shù)參數(shù)的分類 函數(shù)參數(shù)分為兩類:形參 及 實參 形參:形參是在創(chuàng)建過程中聲明的參數(shù),如果不給形參
    的頭像 發(fā)表于 11-14 11:13 ?2356次閱讀

    input結果如何傳入參數(shù)

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

    聊聊Redis的使用案例

    今天我們聊聊 Redis 的使用案例。
    的頭像 發(fā)表于 12-13 14:13 ?455次閱讀

    python函數(shù)的萬能參數(shù)

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