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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1198|回復: 12
收起左側

關于堆棧和ram的問題

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

謝謝

回復

使用道具 舉報

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 引導程 ...

請問如果是匯編呢?
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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 都入棧了,
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本不卡免费新一二三区 | 欧美自拍日韩 | 亚洲一区二区三区四区五区中文 | 天天干天天想 | 国产精品毛片一区二区在线看 | 精品久久一区二区三区 | 成人精品鲁一区一区二区 | 久久成人国产精品 | 日韩在线观看一区二区三区 | 香蕉大人久久国产成人av | 久久久久久久久久久久久久久久久久久久 | 国产96在线 | 欧美一区2区三区4区公司二百 | 999久久精品| 亚洲视频一区 | 中文字幕在线视频观看 | 亚洲成人综合网站 | 免费国产精品久久久久久 | 国产高清视频一区 | 久久在线视频 | 国产精品久久国产精品 | 在线观看免费av网站 | 欧区一欧区二欧区三免费 | 精品久久国产 | 综合久久综合久久 | 久久一二 | 久久精品国产一区二区电影 | 亚洲免费一区 | japan25hdxxxx日本 做a的各种视频 | 久久亚洲精品国产精品紫薇 | 激情毛片 | 久久久青草婷婷精品综合日韩 | 91免费高清视频 | 欧美成年网站 | 暖暖日本在线视频 | 久久久久久久国产精品视频 | 亚洲一区二区中文字幕 | 国产精品久久久久久福利一牛影视 | 岛国一区| 国产精品69av | 91综合网|