作者ruemann (此人挂网中……)
看板ASM
标题Re: [问题] 副程式呼叫问题
时间Sat Aug 18 02:57:15 2007
※ 引述《kissy (吻蓝)》之铭言:
: 如题。
: 一般来说,呼叫副程式後,还可以在呼叫的副程式中再呼叫另外的副程式吗?
可以
: 如果可以,那最多可以呼叫几层?(以MCU来说)
你要了解的是该MCU允许多少层的stack和呼叫的概念
众所皆知,呼叫有两个动作,在call时会先把之後要执行的位置存起来(即下一个指令)
,然後在return时把该位置取出并跳回。
储存执行位置的地方称为stack(堆叠),其储存的方式为「先进後出」,後面呼叫的
位置(通常叫PC值)会在上层,取出时也会先被取出,例如:
s0: call s1
...
s1: call s2
... s2 ex 0x64
s2: call s3 s1 <-- ex 0x62
... <--此时stack的状态为: s0 <-- 较低位元,ex 0x60
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。
--
我只是个想赚 P 币的迷途小羔羊
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 203.67.247.99
※ 编辑: ruemann 来自: 203.67.247.99 (08/18 03:01)
※ 编辑: ruemann 来自: 203.67.247.117 (08/18 12:25)
1F:推 kissy:感谢解答。 08/22 00:23