色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    5336

    瀏覽量

    120232
  • Linux
    +關注

    關注

    87

    文章

    11293

    瀏覽量

    209338
  • 函數
    +關注

    關注

    3

    文章

    4327

    瀏覽量

    62573

原文標題:你知道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 ?1168次閱讀

    基于Simulink搭建保護原型函數

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

    函數參數

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

    Python 函數參數分類

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

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

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

    函數參數的分類有哪些

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

    input結果如何傳入參數

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

    python函數的萬能參數

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

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

    今天我們聊聊Modern cpp的兩個非常重要的概念移動語義和轉發引用。
    的頭像 發表于 11-05 16:58 ?269次閱讀
    主站蜘蛛池模板: 久久天天躁狠狠躁夜夜呲| 国产亚洲精品福利视频| 国产精品久久久久久久久99热| 午夜剧场1000| 性xxx免费| 夜夜躁日日躁狠狠| 中文字幕永久在线| 99热精品在线视频观看| wwwwxxxxx中国| 国产精品人妻久久无码不卡| 婚后被调教当众高潮H喷水| 久久精品视在线-2| 嫩草影院地址一地址二| 起碰免费公开97在线视频| 四虎免费影院| 亚洲色 图| 99RE8国产这里只有精品| 俄罗斯XXXXXL18| 交换娇妻呻吟声不停中文字幕| 毛片在线不卡| 色小姐.com| 伊人久久大香线蕉综合影| RUN AWAY无删减全集动漫| 国产人妻XXXX精品HD电影| 牢记永久免费网址| 色噜噜狠狠色综合欧洲| 一本道久在线综合色姐| 99热热在线精品久久| 国产精品美女久久久网站动漫| 久久免费看视频| 色婷婷五月综合中文字幕| 野花高清影视免费观看| 爱情岛论坛免费在线观看| 好好的曰com久久| 欧美一道本一区二区三区| 亚洲不卡视频在线| 99久酒店在线精品2019| 亚洲国产精品嫩草影院永久| 3a丝袜论坛| 久久九九免费| 性饥渴姓交HDSEX|