在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

C語言及ARM中堆棧指針SP設(shè)置的理解與總結(jié)

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

1什么是棧

百度這么說:棧是一種特殊的線性表,是一種只允許在表的一端進(jìn)行插入或刪除操作的線性表。表中允許進(jìn)行插入、刪除操作的一端稱為棧頂。表的另一端稱為棧底。棧頂?shù)漠?dāng)前位置是動(dòng)態(tài)的,對(duì)棧頂當(dāng)前位置的標(biāo)記稱為棧頂指針。當(dāng)棧中沒有數(shù)據(jù)元素時(shí),稱之為空棧。棧的插入操作通常稱為進(jìn)?;蛉霔#瑮5膭h除操作通常稱為退?;虺鰲?。

簡(jiǎn)易理解:

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

CPU的內(nèi)存RAM空間存放規(guī)律一般是分段的,從地址向高地址,依次為:程序段(.text)、BSS段,上面還可能會(huì)有堆空間,然后最上面才是堆棧段。這樣安排堆棧,是因?yàn)槎褩5奶攸c(diǎn)決定的,堆棧的指針SP初始化一般在堆棧段的高地址,也就是內(nèi)存的高地址,然后讓堆棧指針向下增長(zhǎng)(其實(shí)就是遞減)。

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

2堆棧指針的設(shè)置

開始將堆棧指針設(shè)置在內(nèi)部RAM,是因?yàn)椴皇敲總€(gè)板上都有外部RAM,而且外部RAM的大小也不相同,而且如果是SDRAM,還需要初始化,在內(nèi)部RAM開始運(yùn)行的一般是一個(gè)小的引導(dǎo)程序,基本上不怎么使用堆棧,因此將堆棧設(shè)置在內(nèi)部RAM,但這也就要去改引導(dǎo)程序不能隨意使用大量局部變量。

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

3棧的整體作用

保存現(xiàn)場(chǎng);

傳遞參數(shù):匯編代碼調(diào)用 C 函數(shù)時(shí),需傳遞參數(shù);

保存臨時(shí)變量:包括函數(shù)的非靜態(tài)局部變量以及編譯器自動(dòng)生成的其他臨時(shí)變量;

1) 保存現(xiàn)場(chǎng)

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

保存寄存器的值,一般用的是 push 指令,將對(duì)應(yīng)的某些寄存器的值,一個(gè)個(gè)放到棧中,把對(duì)應(yīng)的值壓入到棧里面,即所謂的壓棧。然后待被調(diào)用的子函數(shù)執(zhí)行完畢的時(shí)候,再調(diào)用 pop,把棧中的一個(gè)個(gè)的值,賦值給對(duì)應(yīng)的那些你剛開始?jí)簵r(shí)用到的寄存器,把對(duì)應(yīng)的值從棧中彈出去,即所謂的出棧。其中保存的寄存器中,也包括 lr 的值(因?yàn)橛?bl 指令進(jìn)行跳轉(zhuǎn)的話,那么之前的 PC 的值是存在 lr 中的),然后在子程序執(zhí)行完畢的時(shí)候,再把棧中的 lr 的值 pop 出來,賦值給 PC,這樣就實(shí)現(xiàn)了子函數(shù)的正確的返回

2) 傳遞參數(shù)

C 語言進(jìn)行函數(shù)調(diào)用的時(shí)候,常常會(huì)傳遞給被調(diào)用的函數(shù)一些參數(shù),對(duì)于這些 C 語言級(jí)別的參數(shù),被編譯器翻譯成匯編語言的時(shí)候,就要找個(gè)地方存放一下,并且讓被調(diào)用的函數(shù)能夠訪問,否則就沒發(fā)實(shí)現(xiàn)傳遞參數(shù)了。對(duì)于找個(gè)地方放一下,分兩種情況。一種情況是,本身傳遞的參數(shù)不多于 4 個(gè),就可以通過寄存器 r0~r3 傳送參數(shù)。因?yàn)樵谇懊娴谋4娆F(xiàn)場(chǎng)的動(dòng)作中,已經(jīng)保存好了對(duì)應(yīng)的寄存器的值,那么此時(shí),這些寄存器就是空閑的,可以供我們使用的了,那就可以放參數(shù)。另一種情況是,參數(shù)多于 4 個(gè)時(shí),寄存器不夠用,就得用棧了。

3) 臨時(shí)變量保存在棧中

包括函數(shù)的非靜態(tài)局部變量以及編譯器自動(dòng)生成的其他臨時(shí)變量。

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

    關(guān)注

    134

    文章

    9121

    瀏覽量

    368249
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5359

    瀏覽量

    120806
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7614

    瀏覽量

    137249
  • 指針
    +關(guān)注

    關(guān)注

    1

    文章

    480

    瀏覽量

    70585

原文標(biāo)題:C語言及ARM中堆棧指針SP設(shè)置的理解與總結(jié)

文章出處:【微信號(hào):mcuworld,微信公眾號(hào):嵌入式資訊精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語言指針知識(shí)科普

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

    C語言及ARM堆棧指針SP設(shè)置理解與總結(jié)(轉(zhuǎn)載)

    進(jìn)線程的上下文。設(shè)置棧大小的一個(gè)原則是,保證棧不會(huì)下溢出到數(shù)據(jù)空間或程序空間.CPU在運(yùn)行程序時(shí),會(huì)自動(dòng)的使用堆棧,所以堆棧指針SP就必須要
    發(fā)表于 01-26 17:11

    如何設(shè)置堆棧指針和清理BSS段

    嵌入式ARM開發(fā)環(huán)境下,設(shè)置堆棧指針和清理BSS段的意義
    發(fā)表于 02-04 06:26

    ARM匯編在嵌入式Linux開發(fā)中有何作用

    設(shè)置C 環(huán)境,比如初始化 DDR、設(shè)置 SP指針等等,當(dāng)匯編把 C 環(huán)境
    發(fā)表于 12-20 08:20

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

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

    文件Os_cpu_a.s堆棧指針調(diào)整的原因是什么?

    基礎(chǔ)與實(shí)戰(zhàn)》404 頁解釋:只所以要(1)(2)是因?yàn)?OSTCBHighRdy—>OSTCBStkPtr 保存的是任務(wù)棧位置,而寄存器恢復(fù)后堆棧指針并不指向這,所以要調(diào)33整
    發(fā)表于 02-28 14:03

    C16x堆棧

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

    C語言入門教程-指針

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

    C語言_指針總結(jié)_經(jīng)典講解

    C語言_指針總結(jié)_經(jīng)典講解。
    發(fā)表于 01-06 13:47 ?10次下載

    堆棧指針sp的內(nèi)容是什么

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

    堆棧指針sp的作用是什么

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

    輕松理解C語言指針的實(shí)驗(yàn)和詳細(xì)資料說明

    我并不打算使用過于官方、正統(tǒng)的語言來講解指針。因?yàn)槿绻疫@樣做,就失去了做這個(gè)教程的意義。如果需要,大家完全可以從各大教材、網(wǎng)站找到對(duì)指針正規(guī)的解釋。但無疑,這種正規(guī)、一絲不茍的解釋卻沒法帶領(lǐng)大家,尤其是學(xué)習(xí)
    發(fā)表于 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>的實(shí)驗(yàn)和詳細(xì)資料說明

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

    我并不打算使用過于官方、正統(tǒng)的語言來講解指針。因?yàn)槿绻疫@樣做,就失去了做這個(gè)教程的意義。如果需要,大家完全可以從各大教材、網(wǎng)站找到對(duì)指針正規(guī)的解釋。但無疑,這種正規(guī)、一絲不茍的解釋卻沒法帶領(lǐng)大家,尤其是學(xué)習(xí)
    發(fā)表于 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>的詳細(xì)資料說明

    10小時(shí)輕松學(xué)會(huì)C語言及其編程

    10小時(shí)輕松學(xué)會(huì)C語言及其編程
    發(fā)表于 03-30 15:43 ?15次下載
    10小時(shí)輕松學(xué)會(huì)<b class='flag-5'>C</b><b class='flag-5'>語言及</b>其編程

    C語言指針理解使用

    C語言指針理解使用指針變量的聲明給普通變量的賦值對(duì)比給指針變量的賦值代*的
    發(fā)表于 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>使用
    主站蜘蛛池模板: 免费观看激色视频网站bd| 一区视频在线| 天天干狠狠干| 欧美天天综合| 狠狠干欧美| 免费视频现线观看| 一区卡二区卡三区卡视频| 看a网站| 一级日本大片免费观看视频| 亚洲性人人天天夜夜摸| 婷婷激情电影| 欧美成人综合在线| 黄 色 片免费观看| 成人三级视频| 日本高清免费一本视频在线观看| 国产精品莉莉欧美自在线线| 丁香六月综合激情| av免费网站在线观看| 四只虎免费永久观看| 美女视频网站色| 成人免费看片视频色多多| 天天操夜夜操天天操| 2023天天操| 很黄很污的视频网站| 色综合久久天天综合观看| 开心激情小说| 夜夜骑夜夜操| 操人网站| 国产亚洲第一| 青草青青产国视频在线| sao虎在线精品永久| 校园激情综合网| 色多多视频在线| 国产三级日本三级美三级| 天天色天天色| 免费被黄网站在观看| 伊人亚洲| 毛片不卡一区二区三区| 亚洲国产第一区二区香蕉| 亚洲成成品网站有线| 在线观看你懂的网址|