两次遇到的面试题目求解

talent11   2007-8-13 19:11 楼主
AT89C51为8051系列中比较通用的1个芯片,如果用C语言编写程序,子函数可以被调用最大多少层,为什么?


不知道怎么考虑
从RAM空间,堆栈深度考虑吗?
C语言调用函数时,入栈的除了ACC,DPTR,通用寄存器还有什么,子函数被调用时单片机是如何动作的

回复评论 (7)

跟编译器有一些关系,象Keil要求函数嵌套调用最大为10层。
主要是从RAM空间,堆栈深度考虑,象一个最简单的无参数的函数调用,每次都要存储两个字节的程序计数器的值.再就是函数的参数传递也是用的内存中的堆栈。这个也要考虑,不过一般建议控制在3-5层内。
点赞  2007-8-13 23:21
这个应该是和SP的字长和RAM的值作主要依据吧???
点赞  2007-8-14 09:12
AT89C51的RAM空间为128字节,其中可作为堆栈区的最大空间为120字节。某次函
数调用,至少将PC(2 byte)入栈,当所调用函数为空函数,则函数最大嵌套层数
为60层。

对吗?
点赞  2007-8-14 11:17
好象有8个字节固定被使用了,不能被做堆栈啊?我本人觉得,这个题目不是要得到一个明确的答案啊,主要是看你的考虑问题的方法和对MCU内部结构的了解!
点赞  2007-8-14 23:34
靠,这个题没有答案,你定义的变量都是占用队战的,比如全局变量
你定义多了调用的层就少了,8951向下声称对站
点赞  2007-8-15 11:28
你的考虑方向是对的,保存什么寄存器都应该可以配置。
子函数调用的时候要将返回地址以及函数需要的参数push道stack中
then jump to the function  and execute it

至于社么要保存,那得看你实际你用了哪些寄存器,
你用的都得保存,但是你用C写的话并不关心什么寄存器,编译器会帮你做的。但是仍然是可以配置的。

点赞  2007-8-15 11:54
我试了一下,keil,如果最简单的函数调用,128字节子函数调用可以达64层,只
有PC入栈,SP初始化为0x00h.
有些情况下,子函数调用层数可以是无穷大。如果所有函数返回地址相同,经编
译器优化,那么只有一次PC入栈。
点赞  2007-8-15 17:50
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复