|
发表于 2009-8-19 16:19:02
|
显示全部楼层
首先声明下 编译器并没有出错
我们看程序要结合上下语句一起来看,现在分两种情况:
第一种:我们结合 KeyTime--; 这个语句来看 编译的结果如下
196: KeyTime--;
091 0BD6 DECFSZ 0x56, F
197: if(KeyTime == 0)
092 0008 RETURN
198: {
199: KeyTask++;
093 0AD3 INCF 0x53, F
200: }
201: break;
094 0008 RETURN
在这里,我们看汇编语句,KeyTime-- 汇编后的语句应该是(DECF 0x56, F),但是这里却是(DECFSZ 0x56, F)。
这是编译器结合后面的语句进行了优化,因为后面紧跟着if(KeyTime == 0).
现在来解释下:DECFSZ是减1后判断是否为0,如果是则跳过下个语句,如果不是则继续下个语句。当KeyTime减1后,如果为0则跳过了092行的return语句执行093行的语句,如果不为0则执行092行的return返回,这与C语言表达的一样。
第二种情况:我把KeyTime--这语句去掉后,在来看看编译后的结果
196: // KeyTime--;
197: if(KeyTime == 0)
091 08D6 MOVF 0x56, F
092 1903 BTFSC 0x3, 0x2
198: {
199: KeyTask++;
093 0AD3 INCF 0x53, F
200: }
201: break;
094 0008 RETURN
可见if(KeyTime == 0)并没有编译成return
所以我们看程序要结合上下来看 不能孤立的来对待 |
|