`
yidongkaifa
  • 浏览: 4052764 次
文章分类
社区版块
存档分类
最新评论

Keil中C语言汇编代码比较

 
阅读更多

完成相同的工作,汇编代码也不一样,当然效率也不一样,下面是几段完成相同功能,但C语言表达方式不一样,使得汇编的代码也不一样,从中可以总结用Keil C51编写高效C代码的经验。
1。 代码段比较1
代码1(高效):
538: if (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 = 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 23: // if( ((1C: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 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语言编译器很强的优化功能。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics