最近对比了下C语言和汇编两种语言在单片机领域的差异。汇编作为低级语言,是仅次于机器语言和硬件联系最紧密的语言;而C语言,严格的说也只能算是半个高级语言,相对于其他高级语言来说。这两者比较直观的差异是:汇编语言的实时性非常好,但可读性差,可移植性不强;相反,C语言的可读性强,可移植性高,但实时性比较差。
利用C语言编写单片机程序,不用考虑程序的初始化地址,不用考虑ACC,PSW以及工作寄存器的保护,不用考虑溢出进位CY。而汇编这些都需要考虑到。
今天在编写温度计程序的时候遇到了这个问题,因为以前是用汇编写的,现在翻译成C,在处理负数转换的时候遇到了问题。因为如果温度计转换芯片读出来的是负数,他是以反码的形式表示的,需要对其取反加一。这样就不得不考虑加一后可能溢出的情况。在汇编里这种情况处理起来很简单,低位字节的加法用ADD指令,高位字节用ADDC,这样,如果低位有溢出,CY会置一,高字节ADDC在计算时会将进位CY计算在内。但在C里面就不是这回事了。低字节有溢出,不会影响高字节的加法,这样计算的结果是错误的。请教了下高手,解决方法可以嵌入汇编,也可以直接使用ACC和CY,即每次高位的加法前要先判断CY的值,为1则多加1,为0则正常加法。因为在引用的reg51.h的头文件里包含了这些寄存器和标志位的定义。
这里有一个典型的例子:http://www.51hei.com/mcu/710.html 大家可以从中悟出汇编和c的区别在实际应用中好好把握就行了
当然c语言的简单与方便这是汇编不能比的,我个人觉得把单片机c语言和汇编语言结合来编成是最好的。在需要很精确的地方就嵌套一个汇编的子程序,其他就用c语言。
这些只是本人在平时的实践中作出的小小总结,还请高手给出意见。如有不对,还请批评指出。共同切磋共同进步! |