主函数正在执行程序,突然外部中断了,此时主函数这边被压入堆栈,跑去执行中断函数
我希望运行完中断函数后,不跳回主函数正在执行的那段,而是从主函数另一个指定位置开始执行,怎么做?
比如:
- void main()
- {
- while(1) //主函数的大循环内,有很多行代码,这里先忽略
- {
- .... //不知程序运行到什么地方,这时外部中断被触发了
- ...... //假设这里是中断点---被压入堆栈
- .......
- }
- }
- void init() interrupt 0
- {
- .....
- ...... //我希望程序运行完成中断函数后,不返回主函数的大循环内,而是跳到while(1)的上一条语句
- .......
- }
复制代码
C语言的goto只能在一个函数内跳转,原因很简单,不同的函数的栈不一样,如果从一个函数跳到另一个函数,会导致堆栈不对称,而使程序跑飞。
举个简单的例子来演示一下,加入函数func1使用了5Bytes的栈空间,那么当退出func1时就要释放5bytes的栈空间,函数func2使用4bytes的栈空间。这时假设你调用了func2,消耗了4bytes的栈空间,原则上说你退出函数前要释放这4bytes,然而你用goto直接从func2跳到func1中,程序就不会从func2退出,而是从func1退出,释放了5bytes的栈,这样栈的对称性被破坏了不说,连调用者的现场也被破坏了(原本是保护a寄存器的值,最后却还给了b寄存器)。
所以c不允许这样的非法跳转。汇编编译器则不会限制你这么做,因为汇编里函数的概念没C这么强烈,但随意的在函数间跳转除了会有栈方面的问题,寄存器方面也有问题。
评分
查看全部评分
一周热门 更多>