一.综述:
大家学单片机,都会用到主函数里面的超级循环:while(1),而这个while(1),就是判断括号中的是否为真,1为真,所以一直在此循环。但是,每次循环完一次,都会先判断一次括号里的1。有什么办法把这个步骤省掉呢? 推荐一个指令:for(;;)就这样了。有没有人看到奥妙之处?因为for里面根本没有任何判断。所以编译器会把它优化,没有任何判断,直接执行for里面的语句,这才是真正的死循环。for(;;)比while(1)减少了每次判断一次的指令。 (几个月前一个我和一个学长讨论过这个问题,他用反汇编给我演示了一次,可惜图片我找不到了。我不会反汇编。)
结果是在PC机(VC反汇编)上的汇编指令是一条直接的MOV跳转指令,而在MDK上while(1);和for(;;)生成的汇编指令都是直接的一条sjmp指令。
如果像是这样
和
这样呢?结果是while(1)生成了5行左右的汇编的指令,而for(;;)依旧是一条sjmp指令(MDK环境)。
二:总结 大家用循环的时候最好用for(;;),生成的代码量还能少一些,这也是一个小细节吧~(就是汇编多了4行代码,如果有强迫症的朋友。。看完之后估计你就会一直用for了)。
|