如果你做得程序比较小几 k 而已,用汇编代
码程度会比 c 小点,应为你可以规划的很清楚,
但是如果你的程序稍微大一些那么 c 的优势就
体现出来了,开发速度比汇编快了多得多,代码
长度也不错(因为你无法规划到最最优化),维
护修改比汇编容易得多(恐怕没有那个项目老板
的要求不会改吧?),一般的实时性没有问题,
真的要求时间非常精确也可以嵌入汇编(以前做
cpu 卡,7816-3 的标准,就用汇编做最底层单字
节读写然后用 c 主程序调用)
简单地说,很小的程序,主要是硬件简单控制的
可以用汇编,
稍微复杂一点尤其是牵涉到一些计算或者管理
等方面的最好用 c
现在的 c 编译器,优化功能很好而且 bug 也很少
了。劝你还是开始用 c 吧,你会发现开发有乐趣
的多(推荐 keil c 7.04),去.xiao-qi..cn(好
像是这里下载)
-----------------------------------------
----------------------
c 是高级语言中最接近低级的语言,如果运用熟
练、恰当再结合汇编,其综合评价高于仅使用汇
编。
1:若只有较简单的逻辑操作、逻辑算法、简
单运算,使用汇编会得到较为精准的代码,但用
c 也同样可以做到。
2:若掺有复杂运算、浮点运算、非线性方程
等,汇编恐怕无能为力了(最起码难度很大)。
3:单片机种类繁多,各自的汇编语法大都不
一样,若仅使用汇编,可扩充性、可移植性都很
差,用 c 就会好的多。
4:设想一下,当你花了很大力气用熟了一种
汇编,又有新的品种出现,你要么甘心落后,要
么拼命跟进,不是俄死,就是累死。
以上只是个人浅见,有错当改。
-----------------------------------------
------
汇编:效率高,对硬件的可操控性更强,体积小,
不易维护,可移植性很差
C:效率比较低,硬件可操控性比较差,目标代码
体积大,容易维护,可移植性很好
从事嵌入式系统开发多年,对于软件方面,
从初期的单片机汇编语言编程,到后来的 C++界
面程序编写,已有相当多的经验累积。正是有了
多年的实战经验,对于汇编与高级语言在原理及
应用等方面形成了自已的一些理解,也是我经常
思考的问题,但一直没有以书面的方式记录下
来,今天之所以写下这些文字,正是想做一个归
纳,日后也好参考。
其实,C 语言与汇编语言的区别一直是程序员
们津津乐道的话题。如果你问一个程序员这样的
问题,他也许会这么回答你:“C 语言可读性好,
代码便于维护,便于开发;汇编语言编写的程序
不容易看懂,可维护性不好,但是执行效率高。”
这样回答是没有错的,但只是一个概括,不够深
入。比方说,汇编语言为什么执行效率比 C 语言
高呢?C 语言的可读性又好在哪里呢?汇编语
言不同样可以用注解来提高可读性吗?等等这
些的问题。要真正能回答这些问题,不是一件简
单的事情,也不是三言两语能解释得清的,需要
比较彻底地分析汇编与 C 的本质上的区别。
真的不掉线吗??、????????????
先说汇编,写过汇编的程序员都知道,“汇
编语言实质上机器语言的助记符。”这句话需要
这样来解析:1.CPU 只能运行它所支持的指令
集,而这些指令集当中的每天条指令都是一些二
进制数的序列,也就是“0”和“1”的有序组合;
2.“0”和“1”的组合不便于程序员的记忆因此有
了“MOV A 0x40”等这样的助记符,也就是说在程
序员编写程序的时候,用“MOV A 0x40”来代替一
串“0”和“1”的序列,这样一看就知道是吧“0x40”
单元中的数据搬到累加器 A 当中来。而如果是用
0”和“1”的序列,毫无特征,很难被程序员记住。
这也是为什么要有汇编语言产生的原因了。
以上对汇编语言的解释基本上就道出了汇编
语言的本质,知道了汇编语言的本质,我们不难
理解,汇编语言编译成 CPU 可执行的机器语言其
实只要做一个翻译的动作就好了,因为,助记符
与对应的二进制指令是一一对应的。进而,我们
再来解释为什么汇编语言会比 C 语言有更高的
执行效率。首先,我们要理解一点,类似于 C
的高级语言面对的对象是程序员,而不是 CPU,
为什么这样说呢?原因非常简单,CPU 不认识 C
语言,CPU 只认识以“0”“1”形式存在的指令。而
C 语言的所有语法以及它代码组织形式都是有
助于程序员编写代码的。所以,C 语言编写完程
序后,需要通过编译器将 C 语言编译成与相应
CPU 指令集对应的机器语言。问题来了,前面我
们说过,汇编语言与机器语言是一一对应的。但
是 C 语言呢?当然没这么好事了。C 语言的语法
是固定的,C 语言编写的程序要编译成 CPU 能读
懂的机器语言指令没办法一一对应,所以就需要
有编译规则了。比方说一个 for 循环会有若干条
实现对应 for 循环功能的机器指令对应,而一个
switch,也相应会有机器指令段代替。所以 C
语言最终要编译机器代码,必须要遵从许许多多
的这样的规则才行。我试验过,用 C 编写一个简
单的程序,比方说只包含一个 for 循环,编译出
的代码和用汇编写的最优代码几乎是一样。但代
码量一大,由于受制于规则(不受制也不行呀,
否则编不出来),编出来的代码与用汇编语言写
出来的代码相比就走了不少“弯路”了。虽然说,
现在的很多 C 编译器在编译的时候都会有优化,
但是,不可能做得到效率上等同于与机器语言一
一对应的汇编语言的效率。毕竟,汇编语言可以
理解为直接就是面对 CPU 的,只不过是机器语言
用助记符代替而矣。
以上只是两种语言效率上区别的一个主要原
因,其实,对于资源的利用上,汇编语言同样有
优势。汇编是直接面对 CPU 的语言,只要是在指
令集支持的范围内,汇编语言可以直接而灵活地
管理包括特殊功能寄存器、通用寄存器、存储单
元的每一个字节,甚至是每一个 bit。C 语言对
内存的使用及管理功能也是很强大的,但毕竟还
是受制于语法。举个最简单的例子,C 语言当中
没有对应三字节或是五字节的变量类型,要么
int 型,要么 long 型,所以每次申请必须是固
定的字节数,势必造成内存使用上的浪费。而大
部份汇编语言根本没有这样的语法,在伪指令的
帮助下(其实也只是提高可读性),汇编语言程
序可以使用任意字节数的变量,当然处理起来比
C 语言麻烦得多,最终还是一个字节一个字节地
拼接处理,而用 C 语言写程序就轻松了,不用管
这些,最终编译器会搞定嘛。而轻松的代价就是
造成了浪费。而内存使用效率不高同时也会影响
到整个程序的整体效率。
汇编的最后部份,来说明一下伪批令这个东西
吧。一个不善于用伪指令写汇编程序的程序员不
是一个好的程序员,这就和写 C 语言不用宏是一
个道理。伪批令存在价值在于他提高了汇编语言
的可读性,同时也能简化汇编语言的编程。比方
说最通用的创建立即数名称,而不是用二进制或
十六进制数;创建数据表;ARM 当中的创建全局
及局部变量等。这个不多说了,针对于不同的
MCU 或 CPU 有不同的伪指令。
再来说说 C 吧,C 语言丰富而实用的语句决定
了 C 语言程序灵活性以及强大的代码组织能力。
利用 C 语言,我们可以很方便地编写出庞大的工
程,在版本管理工具的帮助下,可以很轻松地实
现多人协作编程。特别是引入 RT-OS 以后,C 语
言的程序框架更加灵活了,添加功能(任务)更
加轻松。因为,所有的任务的调控可以直接交给
操作系统来做,而程序员需要做的是编写任务
(含一个或多个功能模块)的内容,以及设置任
务的优先级,堆栈数等等。而任务间的通信可以
摆脱“全局变量”这个祸害,完全可以通过信号
量、邮箱、队列等形式来沟通。为什么说“全局
变量”是祸害呢?单程序量不大的时候,“全局变
量”可能是好东西,因为方便嘛,哪都能改它,
哪都能读它。可是,一旦程序大了,源码文件一
多,如果都习惯用全局变量来传递及存贮共用量
的话,灾难就会降临。你会看到数以千计的全局
变量在各各函数间纵横交错,如果真的不掉线
吗??、????????????
这些变量不是你创建的,你会很难知道它的