logo资料库

C语言和汇编语言的区别.pdf

第1页 / 共79页
第2页 / 共79页
第3页 / 共79页
第4页 / 共79页
第5页 / 共79页
第6页 / 共79页
第7页 / 共79页
第8页 / 共79页
资料共79页,剩余部分请下载后查看
调查结果
一、考试培训服务和留学咨询服务是消费者选择最多的留学服务
结语
如果你做得程序比较小几 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 语 言的程序框架更加灵活了,添加功能(任务)更 加轻松。因为,所有的任务的调控可以直接交给 操作系统来做,而程序员需要做的是编写任务 (含一个或多个功能模块)的内容,以及设置任 务的优先级,堆栈数等等。而任务间的通信可以 摆脱“全局变量”这个祸害,完全可以通过信号 量、邮箱、队列等形式来沟通。为什么说“全局 变量”是祸害呢?单程序量不大的时候,“全局变 量”可能是好东西,因为方便嘛,哪都能改它, 哪都能读它。可是,一旦程序大了,源码文件一 多,如果都习惯用全局变量来传递及存贮共用量 的话,灾难就会降临。你会看到数以千计的全局 变量在各各函数间纵横交错,如果真的不掉线 吗??、???????????? 这些变量不是你创建的,你会很难知道它的
分享到:
收藏