各位大侠,本人最近在学习网上流传的几个51任务调度器。其中,当学习到 一个简单的51单片机操作系统的实现 (因为本人暂无权限发链接,请自行搜索) 时,发现一个奇怪的现象,那就是,C51编译器在生成汇编代码的时候,有可能对函数调用生成JMP类型的跳转指令,而不是预期的CALL类型指令。
例如,()
main()中调用os_start()时,生成的是AJMP指令;
os_delay()中调用os_task_switch()时,生成的是AJMP指令。
经过反复试验,突然明白过来,如果一个函数f1()中,紧接其return语句之前(即最外层 }之前)有一个函数调用f2(); ,那么C51编译器就会对f2()的函数调用生成JMP指令,而不是CALL指令。这样的结果,栈仍然是平衡的,却省下了f2()返回点的一对入/出栈操作。 |