Re: [問題] 副程式呼叫問題

看板ASM (組合語言)作者 (老哥交車了 Q_Q:)時間17年前 (2007/08/18 09:45), 編輯推噓1(101)
留言2則, 1人參與, 最新討論串3/4 (看更多)
我記得在8086上 呼叫副程式做堆疊前 會先指到下一行 , 所以應該是 堆疊: s0+n (高位址) s1+n s2+n (低位址) 對嗎? 還是說在單晶片上會有差異? 有錯請指正 3q ※ 引述《ruemann (此人掛網中……)》之銘言: : ※ 引述《kissy (吻藍)》之銘言: : : 如題。 : : 一般來說,呼叫副程式後,還可以在呼叫的副程式中再呼叫另外的副程式嗎? : 可以 : : 如果可以,那最多可以呼叫幾層?(以MCU來說) : 你要了解的是該MCU允許多少層的stack和呼叫的概念 : 眾所皆知,呼叫有兩個動作,在call時先把目前的執行位置存起來,然後在return時 : 把原來的位置取出並跳回。 : 儲存執行位置的地方稱為stack(堆疊),其儲存的方式為「先進後出」,後面呼叫的 : 位置(通常叫PC值)會在上層,取出時也會先被取出,例如: : s0: call s1 : ... : s1: call s2 : ... s2 : s2: call s3 s1 : ... <--此時stack的狀態為: s0 : 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: 220.139.7.214

08/18 12:22, , 1F
是下一行沒錯……睡前寫的還是有問題
08/18 12:22, 1F

08/18 12:22, , 2F
另外高低位元那邊只是表達的方式不同…我會去修改一下
08/18 12:22, 2F
文章代碼(AID): #16nazFsv (ASM)
文章代碼(AID): #16nazFsv (ASM)