Re: [問題] 副程式呼叫問題
※ 引述《ruemann (此人掛網中……)》之銘言:
: ※ 引述《kissy (吻藍)》之銘言:
: : 如題。
: : 一般來說,呼叫副程式後,還可以在呼叫的副程式中再呼叫另外的副程式嗎?
: 可以
: : 如果可以,那最多可以呼叫幾層?(以MCU來說)
: 你要了解的是該MCU允許多少層的stack和呼叫的概念
: 眾所皆知,呼叫有兩個動作,在call時會先把之後要執行的位置存起來(即下一個指令)
: ,然後在return時把該位置取出並跳回。
: 儲存執行位置的地方稱為stack(堆疊),其儲存的方式為「先進後出」,後面呼叫的
: 位置(通常叫PC值)會在上層,取出時也會先被取出,例如:
s0: call s1
p0: ...
...
s1: ...
call s2
p1: ...
...
return
s2: ... p2 ex 0x64
call s3 p1 <-- ex 0x62
p2: ... <--此時stack的狀態為: p0 <-- 較低位址,ex 0x60
...
return
s3: ....
...
return
: stack的大小是有限的,有些的MCU是固定的,有些則是以記憶體大小決定。
: 以8051為例,stack是一個直接存取記憶體區段(128bytes max),扣去四組R0~R7及
: 你使用的空間,stack可能剩不到一半。
: 而8051的定址能力為16bits,所以每call一次就會用掉2bytes,而且通常還會將PSW及
: ACC存起來,也就是會用掉4bytes,所以假設你有64bytes的stack空間,則大約可以呼
: 叫8層,當然一些次及的副程式不用存PSW和ACC的話,可能可以呼叫更多層。
: 而RISC架構的MCU則常以固定stack大小的架構,好處是不佔用記憶體空間,壞處則是比
: 較沒有彈性。
: : 呼叫太多層的話,是否會造成PC值存取造成錯誤?
: : 導致明明程式有在跑,卻無法顯現該有的狀況...?
: 呼叫太多層的話,會有幾個情況,
: 以8051而言,下一次call時,會把資料存到SFR裡面而造成一些問題,當然,return時
: 的值也一定是錯的,也就是程式會跳到一些奇怪的地方……
: 若是固定stack的MCU,則可能是造成stack覆寫,變成無法正確的return回去而造成
: reset。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.1.146
推
08/19 04:02, , 1F
08/19 04:02, 1F
討論串 (同標題文章)
ASM 近期熱門文章
PTT數位生活區 即時熱門文章
-4
30