完成相同的工作,汇编代码也不一样,当然效率也不一样,下面是几段完成相同功能,但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语言编译器很强的优化功能。
分享到:
相关推荐
Keil中C语言与汇编语言混合编程需要注意的几个地方.doc
KEIL 51编程中关于c语言中嵌入汇编代码的初步精简讲解希望对你有所帮助汇编
在嵌入式开发中,C语言具有可移植性强和可读性好等优点,而汇编语言的高效、快速及可直接对硬件进行操作等优点又是C语言所难以达到的,本帖就为大家介绍一下KEIL C51所支持C和汇编混合编程的方法,
keil是德国keil公司开发的单片机集成开发环境,后被ARM公司收购。在keil中c语言编辑程序直观明了,但是贴近硬件的部分也需要使用汇编语言开发。本文档讲解c语言中插入汇编代码的办法。
Keil中C与汇编混合编程的方法 包括如何在C中嵌入汇编代码,在C中调用汇编函数,如何在汇编中调用C语言函数!
keil C语言与汇编语言混合编程的方法
keil C语言与汇编语言混合编程
Keil对lib封装库反汇编成C语言.pdf
keil C对lib封装库反汇编成C语言
keil C语言与汇编语言混合编程(单片机应用)。耐心一点,按照此操作应该可以完成的。
用Keil在C中嵌入汇编(资料转载) 早前公布了C和汇编混编的温度控制器程序,收到一些朋友的询问,他们无法在自己程序中使用我的18B20的汇编子程序或无法正常通过混编后的程序编译。 其实在KEIL中嵌入汇编的方法很...
讲述如何将lib库反汇编成C,辛苦从网上收集而来的,仅供参考,版权归原作者所有
单片机开发必备,C语言在功能上、结构性、可读性、可...如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
其实在KEIL中嵌入汇编的方法很简单。如图一,在C文件中要嵌入汇编的地方用#pragma asm和#pragma endasm分隔开来,这样编译时KEIL就知道这中间的一段是汇编了。
使用这些例子但是你必须把C 语言的程序装入你的汇编程序中这对懂得C 语言和8051 汇编程序指令的人来说并不是一件困难的事 如果你有C 编译器的话那恭喜你使用C 语言进行开发是一个好的决定你会发现 使用C 进行开发将...
Keil C51 软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编,PLM 语言和 C 语言的程序设计,界面友好,易学易用。
在单片机学习的过程中,掌握一点汇编语言是非常有必有的,作为低级语言汇编语言在单片机开发中有它不可取代的作用。但是要提高单片机技能,必须掌握C 语言编程,因为C 语言有强大的模块化管理思想。我想在很多人学习...
keil中怎么在c语言里嵌入汇编语言[收集].pdf
基于Keil51汇编与C语言混合编程方法研究.pdf