C51中 return语句在main()函数中的副作用追踪

2020-01-25 15:21发布

先说结论:
1、        C51中mian()并不是被调用的,而是跳转进去的;
2、        在main()中调用return语句,将会从栈中弹出SP大小的数据到SP中,进而程序会运行到弹出数据指向的地址,C51中可能就是SP指针返回0x0000。

    昨天和我合作一个工程的同事在调试的时候,发现单片机程序会经常出现重启的现象,当时我认为可能是数组溢出、指针越界导致的程序跑飞。
    后来同事将有问题的语句定位到某个分支中的“return 0;”语句上,我一看这居然是在main()函数上使用了“return 0;”,认为程序会在调用这个语句后,
PC指针离开main(),继续执行main()函数后面的代码导致程序跑飞(同事估计是受到VC等PC编译环境的影响,汗~)。
    不过,回到坐位后却想起return对应的指令,会负责将栈中的值取出来赋值给PC指针,这样的话执行“return 0;”后应该返回到调用main()函数的地方。
    既然有疑问就动手吧,首先向同事拿到了出问题的工程,在main()开始的地方设置了两个“return 0;”(分别是第25行和32行)。
    然后进入仿真模式,如下图,可以观察到sp指针指向起始值0x07,PC指针指向0x0000,PC指针的长度为2。
图8.jpg (34.86 KB, 下载次数: 0) 下载附件 2013-12-4 09:44 上传
图8
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
32条回答
颜靖峰
1楼-- · 2020-01-27 21:26
哈哈,可以做自动复位了
DevLabs
2楼-- · 2020-01-28 02:08
IAR 在main()中加return会有警告, 但按道理main()永远也不会执行到return 0那个地方去啊,除非有意.
Alimy
3楼-- · 2020-01-28 06:46
 精彩回答 2  元偷偷看……
llb126yx
4楼-- · 2020-01-28 10:03
佩服佩服,向楼主的钻研精神学习。不过怎么会有人想到在主程序里面使用return呢,这个是为你了返回函数的啊。至于有人说要退出while循环,这个可以使用break啊
颜靖峰
5楼-- · 2020-01-28 10:10
typedef 发表于 2013-12-4 11:03
新版本的Keil C51 V9.52 在main 中使用 return x; 时会有警告

同意
chencc8
6楼-- · 2020-01-28 14:32
llb126yx 发表于 2013-12-8 15:30
佩服佩服,向楼主的钻研精神学习。不过怎么会有人想到在主程序里面使用return呢,这个是为你了返回函数的啊 ...


~我也不清楚为什么这样用,刚来这家公司工作
公司里有些工程师之前貌似没多牢固的基础知识,所以经常能在他们面前摆显一下哈哈,
不过他们会的外设倒是比较时髦,比如WIFI 蓝牙之类的

一周热门 更多>