Keil中C语言汇编代码比较

来源:互联网 发布:微软远程桌面 mac 编辑:程序博客网 时间:2024/04/29 13:45

完成相同的工作,汇编代码也不一样,当然效率也不一样,下面是几段完成相同功能,但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<C:0x1EDC    FD       MOV      R5,A
    24:                         if( ((i>>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<    25:                         #else
    26:                         if( ((i>>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语言编译器很强的优化功能。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 快递买家签收后现在要退货怎么办 支付宝充话费充错对方关机怎么办 闲鱼同意退款了买家不退东西怎么办 被骗了说给存q币怎么办 方正说我的淘宝字体侵权怎么办 买家说收到衣服没有吊牌该怎么办 淘宝下完订单店主不发货怎么办 工商局不给查被告企业的信息怎么办 被职业打假人起诉到法院怎么办 京东购物如果换货不给你发货怎么办 淘宝上发的快递没有了怎么办 天猫购物半个月不发货怎么办 京东网同一产品购买多规格的怎么办 天猫商城购买的家具要退换货怎么办 亚马逊美国站会员日前没销量怎么办 淘宝买的鞋子把脚磨坏了怎么办 拼多多下单 没货 没法发货怎么办 闲鱼退货物流弄坏了卖家拒收怎么办 客户说物流太慢了 要退货怎么办 京东退货物流系统不更新怎么办 把货交给物流但是物流丢货了怎么办 货还在物流就申请退款怎么办 荣耀4x返回键不管用怎么办 华为手机关不了机也开不了机怎么办 荣耀畅玩5x手机密码忘了怎么办 华为短信验证码失败其他错误怎么办 红米3x手机卡顿反应慢怎么办 华为手机不停的自动重启怎么办 华为荣耀4x卡在开机界面怎么办 华为荣耀8青春版密码忘了怎么办 华为手机内存满了开不起来怎么办 华为荣耀畅玩平板2比较卡怎么办 红米4x太卡了怎么办 魅蓝e移动卡只有2g网络怎么办 联通关闭2g网络双卡手机怎么办 小米6x手机插耳机音量大怎么办 音量键和亮度键盘拆了怎么办 荣耀v10锁屏密码忘了怎么办 荣耀9锁屏密码忘记了怎么办 华为荣耀v9锁屏密码忘记了怎么办 荣耀手机密码忘了怎么办数字锁