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语言编译器很强的优化功能。
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语言编译器很强的优化功能。
相关文章推荐
- C语言中main函数的研究,以及对代码断点调试的研究(王爽老师 汇编语言)
- C编译器剖析_1.5 结合C语言来学汇编_浮点数运算(比较大小)
- KEIL编译器【C语言编译选项优化等级说明】【支持C99(变量声明在执行语句之后)】【反汇编设置】【C语言联合汇编】
- IAR与Keil启动代码分析比较
- 单片机的汇编语言与嵌入式C语言的比较
- 一段汇编代码翻译成c语言的练习
- C语言中main函数的研究,以及对代码断点调试的研究(王爽老师 汇编语言)
- KEIL C51环境下,汇编与C语言交叉编译的问题
- 汇编写启动代码之设置栈和调用C语言1
- 汇编写启动代码之设置栈和调用C语言
- 汇编写启动代码之设置栈和调用C语言
- 汇编语言和C语言的比较
- C语言中if 语句的汇编代码
- 汇编写启动代码之关看门狗和设置栈和调用C语言和ICache
- c语言与汇编的混合编程代码
- 识别c语言汇编代码
- KEIL C51环境下,汇编与C语言交叉编译的问题
- 朱老师ARM裸机学习笔记(七):汇编写启动代码之调用C语言
- 用KEIL编写C语言代码,编译过后会出现形如:Program Size: data=13.0 xdata=0 code=417
- [编译环境][gcc]16位程序中汇编代码与C语言代码的混合编译