精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

C語言及ARM中堆棧指針SP設置的理解與總結

5RJg_mcuworld ? 來源:未知 ? 作者:李倩 ? 2018-04-06 19:46 ? 次閱讀

1什么是棧

百度這么說:棧是一種特殊的線性表,是一種只允許在表的一端進行插入或刪除操作的線性表。表中允許進行插入、刪除操作的一端稱為棧頂。表的另一端稱為棧底。棧頂的當前位置是動態的,對棧頂當前位置的標記稱為棧頂指針。當棧中沒有數據元素時,稱之為空棧。棧的插入操作通常稱為進棧或入棧,棧的刪除操作通常稱為退棧或出棧。

簡易理解:

客棧,即臨時寄存的地方,計算機中的堆棧主要用來保存臨時數據,局部變量和中斷/調用子程序程序的返回地址。程序中棧主要是用來存儲函數中的局部變量以及保存寄存器參數的,如果你用了操作系統,棧中還可能存儲當前進線程的上下文。設置棧大小的一個原則是,保證棧不會下溢出到數據空間或程序空間.CPU在運行程序時,會自動的使用堆棧,所以堆棧指針SP就必須要在調用C程序前設定。

CPU的內存RAM空間存放規律一般是分段的,從地址向高地址,依次為:程序段(.text)、BSS段,上面還可能會有堆空間,然后最上面才是堆棧段。這樣安排堆棧,是因為堆棧的特點決定的,堆棧的指針SP初始化一般在堆棧段的高地址,也就是內存的高地址,然后讓堆棧指針向下增長(其實就是遞減)。

這樣做的好處就是堆棧空間遠離了其他段,不會跟其他段重疊,造成修改其他段數據,而引起不可預料的后果,還有設置堆棧大小的原則,要保證棧不會下溢出到數據空間或者程序空間。所謂堆棧溢出,是指堆棧指針SP向下增長到其他段空間,如果棧指針向下增長到其他段空間,稱為堆棧溢出。堆棧溢出會修改其他空間的值,嚴重情況下可造成死機.

2堆棧指針的設置

開始將堆棧指針設置在內部RAM,是因為不是每個板上都有外部RAM,而且外部RAM的大小也不相同,而且如果是SDRAM,還需要初始化,在內部RAM開始運行的一般是一個小的引導程序,基本上不怎么使用堆棧,因此將堆棧設置在內部RAM,但這也就要去改引導程序不能隨意使用大量局部變量。

片內4K的SRAM,SDRAM大小64M,從0x30000000到0x33FFFFFF,當程序在片內SRAM運行的時候,sp的值設置為4096,當程序在SDRAM內運行的時候sp設置為0x34000000,當程序在內部SRAM運行,若已經初始化SDRAM,此時也可以將堆棧指針設置為0x34000000,更加防止了堆棧溢出。

3棧的整體作用

保存現場;

傳遞參數:匯編代碼調用 C 函數時,需傳遞參數;

保存臨時變量:包括函數的非靜態局部變量以及編譯器自動生成的其他臨時變量;

1) 保存現場

現場,意思就相當于案發現場,總有一些現場的情況,要記錄下來的,否則被別人破壞掉之后,你就無法恢復現場了。而此處說的現場,就是指 CPU 運行的時候,用到了一些寄存器,比如 r0,r1 等等,對于這些寄存器的值,如果你不保存而直接跳轉到子函數中去執行,那么很可能就被其破壞了,因為其函數執行也要用到這些寄存器。因此,在函數調用之前,應該將這些寄存器等現場,暫時保持起來(入棧 push),等調用函數執行完畢返回后(出棧 pop),再恢復現場。這樣CPU就可以正確的繼續執行了。

保存寄存器的值,一般用的是 push 指令,將對應的某些寄存器的值,一個個放到棧中,把對應的值壓入到棧里面,即所謂的壓棧。然后待被調用的子函數執行完畢的時候,再調用 pop,把棧中的一個個的值,賦值給對應的那些你剛開始壓棧時用到的寄存器,把對應的值從棧中彈出去,即所謂的出棧。其中保存的寄存器中,也包括 lr 的值(因為用 bl 指令進行跳轉的話,那么之前的 PC 的值是存在 lr 中的),然后在子程序執行完畢的時候,再把棧中的 lr 的值 pop 出來,賦值給 PC,這樣就實現了子函數的正確的返回

2) 傳遞參數

C 語言進行函數調用的時候,常常會傳遞給被調用的函數一些參數,對于這些 C 語言級別的參數,被編譯器翻譯成匯編語言的時候,就要找個地方存放一下,并且讓被調用的函數能夠訪問,否則就沒發實現傳遞參數了。對于找個地方放一下,分兩種情況。一種情況是,本身傳遞的參數不多于 4 個,就可以通過寄存器 r0~r3 傳送參數。因為在前面的保存現場的動作中,已經保存好了對應的寄存器的值,那么此時,這些寄存器就是空閑的,可以供我們使用的了,那就可以放參數。另一種情況是,參數多于 4 個時,寄存器不夠用,就得用棧了。

3) 臨時變量保存在棧中

包括函數的非靜態局部變量以及編譯器自動生成的其他臨時變量。

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

    關注

    134

    文章

    9053

    瀏覽量

    366827
  • 寄存器
    +關注

    關注

    31

    文章

    5319

    瀏覽量

    120016
  • C語言
    +關注

    關注

    180

    文章

    7598

    瀏覽量

    136208
  • 指針
    +關注

    關注

    1

    文章

    480

    瀏覽量

    70511

原文標題:C語言及ARM中堆棧指針SP設置的理解與總結

文章出處:【微信號:mcuworld,微信公眾號:嵌入式資訊精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C語言指針知識科普

    指針C語言最重要也是最難理解的部分,它在我們平時的工作無處不在。
    發表于 09-26 10:26 ?467次閱讀

    C語言及ARM堆棧指針SP設置理解與總結(轉載)

    進線程的上下文。設置棧大小的一個原則是,保證棧不會下溢出到數據空間或程序空間.CPU在運行程序時,會自動的使用堆棧,所以堆棧指針SP就必須要
    發表于 01-26 17:11

    如何設置堆棧指針和清理BSS段

    嵌入式ARM開發環境下,設置堆棧指針和清理BSS段的意義
    發表于 02-04 06:26

    ARM匯編在嵌入式Linux開發中有何作用

    設置C 環境,比如初始化 DDR、設置 SP指針等等,當匯編把 C 環境
    發表于 12-20 08:20

    DR LR與[SP, #-8]這一行程序為什么堆棧指針要減去8個字節的值呢?

    ,SPLDR LR, [SP, #-8]MSR CPSR_c, #(NoInt | SVC32Mode) ;進入管理模式MOV SP, R4 ;設置
    發表于 02-27 10:39

    文件Os_cpu_a.s堆棧指針調整的原因是什么?

    基礎與實戰》404 頁解釋:只所以要(1)(2)是因為"OSTCBHighRdy—>OSTCBStkPtr 保存的是任務棧位置,而寄存器恢復后堆棧指針并不指向這,所以要調33整
    發表于 02-28 14:03

    C16x堆棧

    80C166的基本設計故意偏向于允許像C這樣的結構化語言比在較老的CPU上更高效地運行。 最有用的指令集功能之一是提供16個額外的堆棧指針
    發表于 09-04 07:05

    C語言入門教程-指針

    指針C語言中,指針被廣泛使用。所以要想完整地掌握C語言,您需要對
    發表于 07-29 11:30 ?657次閱讀

    C語言_指針總結_經典講解

    C語言_指針總結_經典講解。
    發表于 01-06 13:47 ?10次下載

    堆棧指針sp的內容是什么

    堆棧是一塊保存數據的連續內存。一個名為堆棧指針SP)的寄存器指向堆棧的頂部。 堆棧的底部在一個
    發表于 11-13 09:04 ?3.4w次閱讀
    <b class='flag-5'>堆棧</b><b class='flag-5'>指針</b><b class='flag-5'>sp</b>的內容是什么

    堆棧指針sp的作用是什么

    SP是一個8位專用寄存器,它批示出堆棧頂部在內部RAM塊的位置。系統復位后,SP初始化為07H,實際上堆棧是由08H單元開始的。考慮08H
    發表于 11-13 09:17 ?6.8w次閱讀
    <b class='flag-5'>堆棧</b><b class='flag-5'>指針</b><b class='flag-5'>sp</b>的作用是什么

    輕松理解C語言指針的實驗和詳細資料說明

    我并不打算使用過于官方、正統的語言來講解指針。因為如果我這樣做,就失去了做這個教程的意義。如果需要,大家完全可以從各大教材、網站找到對指針正規的解釋。但無疑,這種正規、一絲不茍的解釋卻沒法帶領大家,尤其是學習
    發表于 04-11 16:08 ?10次下載
    輕松<b class='flag-5'>理解</b><b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>指針</b>的實驗和詳細資料說明

    如何輕松理解C語言指針的詳細資料說明

    我并不打算使用過于官方、正統的語言來講解指針。因為如果我這樣做,就失去了做這個教程的意義。如果需要,大家完全可以從各大教材、網站找到對指針正規的解釋。但無疑,這種正規、一絲不茍的解釋卻沒法帶領大家,尤其是學習
    發表于 05-08 17:48 ?11次下載
    如何輕松<b class='flag-5'>理解</b><b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>指針</b>的詳細資料說明

    10小時輕松學會C語言及其編程

    10小時輕松學會C語言及其編程
    發表于 03-30 15:43 ?15次下載
    10小時輕松學會<b class='flag-5'>C</b><b class='flag-5'>語言及</b>其編程

    C語言指針理解使用

    C語言指針理解使用指針變量的聲明給普通變量的賦值對比給指針變量的賦值代*的
    發表于 01-13 13:42 ?3次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>指針</b>的<b class='flag-5'>理解</b>使用