作者softcloud (老哥交车了 Q_Q:)
看板ASM
标题Re: [问题] 副程式呼叫问题
时间Sat Aug 18 09:45:49 2007
我记得在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
1F:推 ruemann:是下一行没错……睡前写的还是有问题 08/18 12:22
2F:→ ruemann:另外高低位元那边只是表达的方式不同…我会去修改一下 08/18 12:22