本帖最后由 dontium 于 2014-10-9 10:28 编辑
比较两数大小 编译器:CCS V6 CPU: C2000 任务:比较两数大小 目的:看看CCS会不会用C28 的MAX、MIN指令
例句:
使用C语言编程,其C语句如下, if ( xyz >abc ) abc= xyz; 即判断最大数,并将其保留。 在C28的CPU中,有16位最大(最小)数的比较指令,也有32位的最大(最小)数的比较指令,16位及32位的比较指令均为单周期,16位比较指令可以嵌套重复指令,32位的却不能。如果使用汇编语言,最少可以用两个指令(MOVW指令为定位数据段,如果之前的指令在同一段内,可以省去)。最佳效果为: MOVW DP,#_abc ; 1周期,定位数据段,并假设两数均在同一段内(下同) MOV AL, @_abc ; 1周期 MAX AL, @_xyz ; 1周期 现在使用CCS V6编译器,在不同情况下对上述C语句进行编译,以下是几种情况下的编译结果 一、不优化时 MOVW DP, #_abc MOV AL,@_abc ; 1周期 CMP AL,@_xyz ; 1周期 B $C$L2,HIS ;7周期(条件真)/ 4周期(条件假)| MOV AL,@_xyz ;1周期 MOV @_abc,AL ; 1周期 $C$L2,HIS: …… 二、0级优化 语句同上 三、1级优化, MOV AL,@_abc MOVB @_xyz,#55,UNC CMPB AL,#55 ; B $C$L2,LOS ; MOV @_xyz,AL ; $C$L2,LOS: …… 四、2级优化 MOVW DP,#_xyz ; MOV AL,@_abc ; . MOVB @_xyz,#55,UNC ; CMPB AL,#55 ; MOV @_xyz,AL,HI ; 五、3级优化 MOVW DP,#_xyz ; MOV AL,@_abc ; MOVB @_xyz,#55,UNC ; CMPB AL,#55 ; MOV @_xyz,AL,HI ; 六、4级优化 MOVW DP,#_xyz ; MOV AL,@_abc ; MOVB @_Txyz,#55,UNC ; CMPB AL,#55 ; MOV @_Txyz,AL,HI ; 七、4级优化+优化速度最快 MOVW DP,#_xyz ; MOV AL,@_abc ; MOVB @_xyz,#55,UNC ; CMPB AL,#55 ; MOV @_xyz,AL,HI ;
由上可见,在1级优化以前,都使用了跳转指令,它会占用很多时间(7个或4个周期), 而在后面的优化级别里,使用了有条件保存(MOV loc16, AX, COND)这样一条指令,但是,用这个指令必须要有标志位的支持,所以都不例外地使用了CMP指令。 在所有的优化级别里,均未用到C28中的MAX(MIN)指令,可见,编译器对CPU指令的应用还不到位,对CPU效率的发挥还存在障碍。
|