久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1160|回復: 12
打印 上一主題 下一主題
收起左側

關于堆棧和ram的問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:1039663 發表于 2024-10-31 11:14 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
rt,51單片機中的用戶ram是從30h-7fh,堆棧也是在這個區域中,有幾個問題;1.請問如果用push/pop的堆棧區域的總容量是多少?是直接從30h開始連續存放嗎?如果是這樣的話那么通過直接尋址就能訪問到堆棧中元素了,是不是和堆棧思想不符?
2. 堆棧的容量是固定的嗎,會小于整體用戶ram區容量嗎?如果是的話如果自己用ram中非堆棧區作為自己的臨時變量應該從多少地址開始?

謝謝

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1109793 發表于 2024-10-31 17:57 | 只看該作者
用C,不用關心這些吧
回復

使用道具 舉報

板凳
ID:624769 發表于 2024-10-31 18:36 | 只看該作者
51單片機的堆棧 存放起始位置 由 寄存器 SP 設定。
通常,如果C語言編譯,并且加載了 STARTUP.A51 引導程序,SP默認為 用于變量聲明結束后位置。
至于堆棧容量多大,站在51單片機的硬件角度看,理論上可以最大256字節,當然,這是理論上。實際應用時寄存器組最少需要8個字節,那么,即使你的代碼中沒有聲明任何變量,堆棧也只有248字節了,加上如果用的 AT89C51 RAM只有128 那么,實際堆棧可使用最大容量只有120字節。
又因為堆棧只能順序往后遞增,一旦你有聲明 位 變量,必須占用 20H 字節地址,那么 堆棧最少要從 21H 位置開始,這樣可以使用的堆棧容量最大只有95字節。
回復

使用道具 舉報

地板
ID:1039663 發表于 2024-10-31 19:51 | 只看該作者
188610329 發表于 2024-10-31 18:36
51單片機的堆棧 存放起始位置 由 寄存器 SP 設定。
通常,如果C語言編譯,并且加載了 STARTUP.A51 引導程 ...

請問如果是匯編呢?
回復

使用道具 舉報

5#
ID:517466 發表于 2024-10-31 21:23 | 只看該作者
匯編也好,C也好,都涉及SP的設置。只不過C中幫你做了處理。在匯編中,你需要根據程序中中斷的多少,子程序的嵌套調用級數,確定堆棧的深度。中斷處理越多,子程序嵌套越多,就越需要堆棧的深度。
回復

使用道具 舉報

6#
ID:401564 發表于 2024-11-1 00:19 | 只看該作者
1,堆棧區域的總容量是多少?
這并不重要,重要的是你要了解單片機編程的原理,對于8051而言,30h-7fh都可以
但一個合格的單片機C語言程序,16層的堆棧幾乎能應對99.9%的程序,再不行可以用32層
也就是
MOV SP, #5FH
如果你還不明白我說的是什么,那就得再去看一上單片機編程的原理,因為,并不是所有的單片機都是像51這樣,用軟件堆棧的,有的是硬件堆棧,而且只有4層,如果你不了解其中的原理,到時候寫起代碼來,問題很多的
2,這個問題參考上面的回答就可以了
回復

使用道具 舉報

7#
ID:1073939 發表于 2024-11-1 09:23 | 只看該作者
1. 51的堆棧通常安排在ram區的最后區域,一般情形下有30個字節夠用了,即60h-7fh(或e0h-ffh),堆棧容量當然越大越好。
2. c編譯器會自動安排,把未用到的ram全部用作堆棧。你只要確認編譯后用到的的data區小于96(或220)字節,否則要修改代碼。
匯編非常靈活,堆棧可安排在20H后的任意區域。假如按C編譯器的做法(推薦),自己的臨時變量是從地址20h開始。
回復

使用道具 舉報

8#
ID:1039663 發表于 2024-11-1 20:57 | 只看該作者
Y_G_G 發表于 2024-11-1 00:19
1,堆棧區域的總容量是多少?
這并不重要,重要的是你要了解單片機編程的原理,對于8051而言,30h-7fh都可以
...

我之前是使用8086匯編的,在調用子程序的時候需要進行保護現場和恢復現場,會用到很多的堆棧來干這個事,請問51中也是需要這樣做嗎?我看很多的視頻和教材里都是只保存PC和PSW
回復

使用道具 舉報

9#
ID:401564 發表于 2024-11-1 22:46 | 只看該作者
首先,你要知道單片機選擇匯編的原因
1,之前版本的穩定量產程序是匯編的,新產品只要稍稍改一小部分就可以生產的
2,片上資源實在太少了,比如,RAM只48B這種的低端單片機
3,單片機本身就沒有C編譯器,只能用匯編
4,對時序要求非常嚴格的,精確到一個時鐘的程序
除了以上說的,沒有其它理由再選擇匯編了,相信我,我用了3年的匯編,現在用C了
回復

使用道具 舉報

10#
ID:401564 發表于 2024-11-1 22:58 | 只看該作者
教材里都是只保存PC和PSW,那是因為沒有用到其它的地址,其它地址的數據沒有什么改變,不需要做什么事情
如果累加器A在別的子程序中用到,而中斷中也用到A的話,這個時候就要保存A了,同理,R2-R7也一樣的
只要中斷服務中斷外的子程序都用到一個地址的時候,中斷就要進行現場保護
對于你而言,我建議是放棄匯編,去用C,如果不會C,也可能現在開始學C,可能剛開始的時候有點不習慣,但是,不管是現在還是將來,C一定是單片機最好的選擇,熟練C要比熟練匯編好上很多倍
上古時期的東西,不需要學,不要迷戀網上說的那些匯編的好處,也不要覺得匯編是基礎,必需要學的
沒有必要,你看現在,誰還學機器語言,操作碼的
回復

使用道具 舉報

11#
ID:624769 發表于 2024-11-2 00:42 | 只看該作者
zjm001 發表于 2024-11-1 20:57
我之前是使用8086匯編的,在調用子程序的時候需要進行保護現場和恢復現場,會用到很多的堆棧來干這個事, ...

51而言,PC是硬件層直接 入棧的,會占用堆棧的兩個字節,但是,不需要你手動去操作,當你 CALL 的時候,就入棧,RET的時候 就自動出棧,同理當中斷觸發時,PC會自動入棧,當執行到 RETI時就會自動出棧。而其他的寄存器,比如,PSW, ACC, DPTR 這些,就要你自己手動的一個個 PUSH 和 POP了。至于保存哪些,取決于你的子程序 需要用到哪些,比如,你的子程序中 需要 執行,MOVC   A,@A+DPTR  那么,你肯定需要把 ACC, DPL, DPH 都入棧了,
回復

使用道具 舉報

12#
ID:384109 發表于 2024-11-2 08:48 | 只看該作者
你可以看看51的教材,你說使用過8086的匯編,那么你所提的問題也就是說你沒有看過51的教材,關于51的堆棧,教材中是一定會有說明的
回復

使用道具 舉報

13#
ID:349276 發表于 2024-11-2 12:43 來自手機 | 只看該作者
棧是為臨時變量開辟的區域,大小應該不能固定。因為涉及函數調用,嵌套層數多,空間就用得多。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产欧美一区二区成人 | 午夜精品在线观看 | 久久综合伊人一区二区三 | 91秦先生艺校小琴 | 免费av观看| 欧美精品一区二区三区在线 | 粉嫩av在线| 日韩欧美在线播放 | 超碰成人免费观看 | 国产婷婷综合 | 成人在线视频网站 | 九九热在线视频观看这里只有精品 | 国产成人精品久久久 | 国产超碰人人爽人人做人人爱 | 四虎影视1304t | 91人人看 | 国产欧美一区二区三区在线播放 | 亚洲精品成人在线 | 国产日韩精品视频 | 精品国产乱码久久久久久久久 | 欧美精品在线播放 | 日本福利一区 | 免费av在线网站 | 日韩有码一区 | 国产精品国产a | 成人在线观看黄 | 日韩一区二区三区四区五区六区 | 欧洲免费毛片 | 国产高清久久久 | 五月免费视频 | 久久99深爱久久99精品 | 国产农村一级片 | 中文字幕日韩欧美一区二区三区 | 免费在线观看一区二区三区 | 中文精品视频 | 亚洲精彩免费视频 | 天天干干 | 婷婷福利视频导航 | 一级大片网站 | 综合久久久久久久 | 在线观看特色大片免费网站 |