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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

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

函數(shù)棧

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

好的,簡單了解了內(nèi)存地址空間的棧后,我們還需要簡單了解一下EBP和ESP這兩個寄存器,EBP是用保存棧低地址的,而ESP用于保存棧頂?shù)刂罚恳淮魏瘮?shù)調(diào)用會涉及到一個棧幀,棧幀結(jié)構(gòu)如下圖

舉個實(shí)例詳細(xì)說明一下一個函數(shù)幀的特點(diǎn),比如

/* B被A調(diào)用

* 參數(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調(diào)用B函數(shù) */

void A (void)

{

int a_s1;

int a_s2;

int a_s3;

B (1, 2, 3);

printf ("1\n");

}

在以上例子中棧幀情況應(yīng)該如下圖所示

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

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

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

建立B棧幀

壓入A棧幀的棧底

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

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

小結(jié)

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

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

    關(guān)注

    31

    文章

    5300

    瀏覽量

    119860
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11213

    瀏覽量

    208736
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4286

    瀏覽量

    62335

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    聊聊std::move函數(shù)和std::forward函數(shù)

    今天我們聊聊Modern cpp的兩個非常重要的概念移動語義和轉(zhuǎn)發(fā)引用。
    的頭像 發(fā)表于 11-05 16:58 ?166次閱讀