作者ggg12345 (ggg)
看板ASM
标题Re: [问题] 副程式呼叫问题
时间Sun Aug 19 03:21:21 2007
※ 引述《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
1F:推 ruemann:辛苦了……在下懒得加return,想来会引起误会,感谢。 08/19 04:02