打印

为什么C51有时候把函数调用汇编成JMP指令?我的解释

[复制链接]
2327|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xxf_cz|  楼主 | 2013-5-28 09:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠,本人最近在学习网上流传的几个51任务调度器。其中,当学习到 一个简单的51单片机操作系统的实现 (因为本人暂无权限发链接,请自行搜索) 时,发现一个奇怪的现象,那就是,C51编译器在生成汇编代码的时候,有可能对函数调用生成JMP类型的跳转指令,而不是预期的CALL类型指令。

例如,()
main()中调用os_start()时,生成的是AJMP指令;
os_delay()中调用os_task_switch()时,生成的是AJMP指令。

经过反复试验,突然明白过来,如果一个函数f1()中,紧接其return语句之前(即最外层 }之前)有一个函数调用f2(); ,那么C51编译器就会对f2()的函数调用生成JMP指令,而不是CALL指令。这样的结果,栈仍然是平衡的,却省下了f2()返回点的一对入/出栈操作。

相关帖子

沙发
ayb_ice| | 2013-5-28 09:41 | 只看该作者
void func1(void)
{
    func2();
    func3();
}
以上调用func3时可以用JMP,正常是调用3后返回到func1,1又马上返回了,而直接跳转到3,3返回后直接返回更快,省堆栈还节省时间

void func1(void)
{
    func2();
    func3();
   _nop_();
}
但这样是不行的


使用特权

评论回复
板凳
huangxz| | 2013-5-28 09:59 | 只看该作者
赞一个,编译器还是很厉害的:lol

使用特权

评论回复
地板
cool_coder| | 2013-5-28 10:41 | 只看该作者
深究编译器的细节对写出高效的C代码很有帮助。LZ钻研细节的态度令人佩服。

使用特权

评论回复
5
menfiss| | 2013-12-20 12:11 | 只看该作者
高,实在是高

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝