您的位置:首页 > 编程语言 > C语言/C++

Keil中C语言汇编代码比较

2007-11-02 06:26 525 查看
完成相同的工作,汇编代码也不一样,当然效率也不一样,下面是几段完成相同功能,但C语言表达方式不一样,使得汇编的代码也不一样,从中可以总结用Keil C51编写高效C代码的经验。
1。 代码段比较1
代码1(高效):
   538:                                                 if (currPrintingByte < 9 && currPrintingByte > 0){
C:0x06EC    E53A     MOV      A,currPrintingByte(0x3A)
C:0x06EE    C3       CLR      C
C:0x06EF    9409     SUBB     A,#0x09
C:0x06F1    4003     JC       C:06F6
C:0x06F3    0204FE   LJMP     C:04FE
C:0x06F6    E53A     MOV      A,currPrintingByte(0x3A)
C:0x06F8    9400     SUBB     A,#CmdBuff(0x00)
C:0x06FA    5003     JNC      C:06FF
C:0x06FC    0204FE   LJMP     C:04FE
   539:                                                         Pmr_HoriZoomIn = currPrintingByte;
C:0x06FF    853A2B   MOV      Pmr_HoriZoomIn(0x2B),currPrintingByte(0x3A)
   540:                                                         ComputeDotLimit();
   541:                                                 }
   542:                                                 #endif
   543:                                                 break;
C:0x0702    020790   LJMP     C:0790
代码2:
   533:                                                 if (currPrintingByte <= 8 && currPrintingByte >= 1){
C:0x06EC    E53A     MOV      A,currPrintingByte(0x3A)
C:0x06EE    D3       SETB     C
C:0x06EF    9408     SUBB     A,#0x08
C:0x06F1    4003     JC       C:06F6
C:0x06F3    0204FE   LJMP     C:04FE
C:0x06F6    E53A     MOV      A,currPrintingByte(0x3A)
C:0x06F8    C3       CLR      C
C:0x06F9    9401     SUBB     A,#0x01
C:0x06FB    5003     JNC      C:0700
C:0x06FD    0204FE   LJMP     C:04FE
   534:                                                         Pmr_HoriZoomIn = currPrintingByte;
C:0x0700    853A2B   MOV      Pmr_HoriZoomIn(0x2B),currPrintingByte(0x3A)
   535:                                                         ComputeDotLimit();
   536:                                                 } 
   543:                                                 break;
C:0x0703    020791   LJMP     C:0791
    由以上代码比较可知,用简单的比较表达式>,==,<,!=, 比复杂的>=, <=汇编的代码效率要高。
2、代码段比较2
代码段1(高效):
    22:                  for( b = 0; b<8; b++){
    23:                         // if( ((1<>b) & 0x01)){
C:0x1EDD    EF       MOV      A,R7
C:0x1EDE    A805     MOV      R0,0x05
C:0x1EE0    08       INC      R0
C:0x1EE1    8002     SJMP     C:1EE5
C:0x1EE3    C3       CLR      C
C:0x1EE4    13       RRC      A
C:0x1EE5    D8FC     DJNZ     R0,C:1EE3
C:0x1EE7    30E001   JNB      0xE0.0,C:1EEB
    25:                                  tmpCnt++;
C:0x1EEA    0E       INC      R6
    26:                          }
    27:                  }
C:0x1EEB    0D       INC      R5
C:0x1EEC    BD08EE   CJNE     R5,#0x08,C:1EDD
代码段2:
    22:                  for( b = 0; b<8; b++){
    23:                         #if 1
C:0x1EB3    FC       MOV      R4,A
    24:                         if( ((1<>b) & 0x01)){
    27:                         #endif
C:0x1EB4    7401     MOV      A,#0x01
C:0x1EB6    7E00     MOV      R6,#CmdBuff(0x00)
C:0x1EB8    A804     MOV      R0,0x04
C:0x1EBA    08       INC      R0
C:0x1EBB    8005     SJMP     C:1EC2
C:0x1EBD    C3       CLR      C
C:0x1EBE    33       RLC      A
C:0x1EBF    CE       XCH      A,R6
C:0x1EC0    33       RLC      A
C:0x1EC1    CE       XCH      A,R6
C:0x1EC2    D8F9     DJNZ     R0,C:1EBD
C:0x1EC4    FF       MOV      R7,A
C:0x1EC5    ED       MOV      A,R5
C:0x1EC6    FB       MOV      R3,A
C:0x1EC7    EF       MOV      A,R7
C:0x1EC8    5B       ANL      A,R3
C:0x1EC9    6001     JZ       C:1ECC
    28:                                  tmpCnt++;
C:0x1ECB    09       INC      R1
    29:                          }
    30:                  }
C:0x1ECC    0C       INC      R4
C:0x1ECD    BC08E4   CJNE     R4,#0x08,C:1EB4
由以上代码,代码段1显示比代码段2效率要高得多,短短的一行C代码表达式不同,编译生成的机器码就相差10个字节,原因在于代码段2中需要每次都要把0x01置入累加器A,并且在进行与操作时用的是逻辑与指令,而代码段1就可以很巧妙地使用可位寻址的内存,只通过一条JNB指令完成,代码量小而且运行速度快,充分体现的KEIL的C语言编译器很强的优化功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: