汇编语言魅力不减当年——MCU汇编语言的“工程”化
2012-03-15
一、引言
提起汇编语言,首先想到的就是他的缺点:晦涩难懂、调试困难、不易维护、兼容性差等等。这些原因也使多数人退而求其次,去选择其他编程语言。其他语言也都有它的优、缺点,所以选择语言就取决于实际开发的系统大小、硬件配置、开发系统的侧重点等。
二、汇编语言及高级语言的比较
由于汇编语言可以表达非常底层的东西:
1)可以直接存取寄存器和I/O;
2)编写的代码可以非常精确的被执行;
3)可以编写出比一般编译系统高效的代码;
4)可以作为不同语言或不同标准的接口。
等具有其他语言不可超越的优势,还是深受那些运行速度和容量控制严格的系统编程人员的喜爱。个人认为只有差的程序员,而没有差的编程语言。任何的编程语言,只要融会贯通,灵活运用,他都可以成为人们的最爱,让我们逐步来探讨汇编的魅力吧。
汇编语言是公认的效率最高的计算机语言,运用的好同样可以与高级语言一比高下。甚至还存在这样的说法,“在熟悉汇编语言的人眼里,C语言编写的程序都是垃圾”。这种说法虽然偏激了一些,但是却有它的道理。举例来说,在实时性上C语言就有很大的弱点,无法预测代码执行的指令周期。在这里不妨用下面的例子说明一下此问题。
我们来做个20us的延时程序,使用汇编语言(使用12M晶振),如下面语句就可以达到要求了
使用C语言如何实现呐?C语言的灵活性也许会写出多种不同的实现方式,下面是列出的几种:
这些不同的写法,是否都是高效的?生成的代码是否一致呐?把这些写法使用KEIL C反汇编后,由于篇幅限制仅把delay_1()函数反汇编的结果列出如下:
就会发现只有delay_4( )生成的代码同汇编的效率是一样的,其他的写法都存在时间的不确定性。
这样来看,你是否认为汇编先天就比C更有魅力呐?
再举两个实际生活的例子,现在热门的智能手机领域,智能手机都有具有操作系统的程序扩展性,都可以支持第三方软件安装、应用。NOKIA N70为2005年出品CPU采用ARM 220MHz,内存容量为20MB,而相近价位的多普达818为2004年出品采用Intel Bulverde 416MHz,内存容量64MB;64MB ROM,64MB SDRAM,从硬件配置上前者明显低于后者,但是性能却略胜一筹,这就是由于他们各自采用的操作系统不同,前者采用Series 60第2版,Symbian OS 8.1,后者采用WindowsMobile(PocketPC) 2003,明显后者更消耗资源,而前者操纵性界面等并没有受其影响。
个人电脑领域也是一样,硬件更新换代的速度惊人,计算机硬件界的摩尔定律:每隔18个月计算机硬件的运算速度提高一倍,价格就下降一半。同时软件也在不断的升级,然而我们并没有体会到使用高配置的硬件加上换代的软件带给我们多大的改善。
其实,深究之下就会发现,所谓的高级语言,只是让人省事,使用了一些格式化的框框,把人的想法直接组合成面向过程的指令,或者面向对象的类。这类语言入门是简单的,到达目的地是曲折的。这就好象有一条明朗宽敞的大道把你引到迷宫入口,让你在人为制造的千丝万缕、错综复杂的环境里到达目的地。殊不知在入口旁边有一个不起眼的长满荆棘的羊肠小道直通目的地。
在重视资源的今天,我们相信展现在汇编面前的是个更大的天地。
灵活运用汇编语言,把汇编用活,就会发现他就象是画笔,把你训练成一个艺术家,使用汇编之笔绘画出无比美好灿烂的世界。无意义的音符能编出美妙的音乐,无规律的色彩可幻化缤纷的世界,冰冷的汇编语言可创造资讯的天堂!
三、大本不立,小规不正
“大本不立,小规不正”。首先掌握一些计算机软件的理论知识,再结合自己编程实践及芯片的特色,理论应用到汇编实践中去,两者融会贯通。从高处俯视,而彻底改变汇编的编程方式,充分施展汇编编程的魅力。
下面专门从汇编的弱点入手,谈谈如何改善晦涩难懂、调试困难、不易维护、兼容性差等问题,让他散发风格魅力、维护魅力和移植魅力。
1.风格魅力
风格魅力,就是指用户界面友好,操作简便以及用户在使用软件上花的时间很少,不必培训或很少的培训就能使用软件等。个人电脑里广泛应用的滚动条已经被多数人所接受,它能增加界面的扩展性和易操作性。我们也不妨把它引入汇编程序里来,实现后就会发现它比用C或C++实现的程序精简得多并更具有个性。例如我在逐行高清电视方案(LA7605+HTV110)中使用LC8632系列MCU开发的滚动条,图形效果如下:
此程序的难点是做成通用性,如果没有达到通用的话,就不能复用,就没有了移植魅力是万万不行的。例如功能菜单中有许多功能是作成OPTION可选的,在工厂中打开此功能则菜单中出现此项,否则就不显示此功能,这样菜单的滚动就需要对OPTION选项进行判断,再进行是否滚动的操作。
2.维护魅力
维护魅力。编程大师曾说:“哪怕程序只有三行长,总有一天你也不得不对它维护。”
很多软件产品不是一次性的买卖。比如在电信、金融等领域,有些软件系统要用十几年,对软件进行维护是必不可少的。
对软件而言,“维护”是个不太直观的术语,因为软件产品在重复使用时不会被磨损,并不需要进行像对车辆或电器那样的维护。软件维护是人们对既丰富多彩又会令人心酸的活动的统称。其中丰富多彩的活动是指那些反映客观世界变化、能使软件系统更加完善的修改和扩充工作。令人心酸的活动是指那些永无修止、并且改了旧错却引起新错让人欲哭无泪的工作。
在上个世纪80年代,维护的代价占软件开发总支出的80%,在90年代,维护的代价已经占据90%之多。以下一些因素将导致维护工作变得困难:
(1)软件人员经常流动,当需要对某些程序进行维护时,可能已找不到原来的开发人员。只好让新手去“攻读”那些程序。
(2)人们一般难以读懂他人的程序。在勉强接受这类任务时,心里不免嘀咕:“我又不是他肚子里的虫子,怎么知道他如何编程。”
(3)当没有文档或者文档很差时,你简直不知道如何下手。
(4)很多程序在设计时没有考虑到将来要改动,程序之间相互交织,触一而牵百。即使有很好的文档,你也不敢轻举妄动,否则你有可能陷进错误堆里。
(5)如果软件发行了多个版本,要追踪软件的演化非常困难。
(6)维护将会产生不良的副作用,不论是修改代码、数据或文档,都有可能产生新的错误。
(7)维护工作毫无吸引力。高水平的程序员自然不愿主动去做,而公司也舍不得让高水平的程序员去做。带着低沉情绪的低水平的程序员只会把维护工作搞得一塌糊涂。
影响维护代价的技术因素主要有:
(1)软件对运行环境的依赖性。由于硬件以及操作系统更新很快,使得对运行环境依赖性很强的应用软件也要不停地更新,维护代价就高。
(2)编程语言。虽然低级语言比高级语言具有更好的运行速度,但是低级语言比高级语言难以理解。用高级语言编写的程序比用低级语言编写的程序的维护代价要低得多(并且生产率高得多)。这也是商业应用软件大多采用高级语言的原因。
(3)编程风格。良好的编程风格意味着良好的可理解性,可以降低维护的代价。
(4)测试与改错工作。如果测试与改错工作做得好,后期的维护代价就能降低。反之维护代价就升高。
(5)文档的质量。清晰、正确和完备的文档能降低维护的代价。低质量的文档将增加维护的代价(错误百出的文档还不如没有文档)。
我们将从三个方面来改变汇编维护困难的局面。包括易理解性、易测试性、易修改性。在开发软件时应使程序具有良好的程序结构,易于阅读,便于理解。同时软件在使用过程中发现了隐藏的错误时,程序是易测试的,以便及时找到BUG。当需要改正错误或程序功能需要完善和扩充时,程序应是易于修改的。
(1)易理解性
1)选择标识符名字的方法有:含义明确;名字也不能太长;不能是关键字;不能有多个含义;不使用相似的名称,如ILI、LII、IIL等;避免使用易混淆的字母,如0与O,1与l等。
2)视觉清晰:大量使用缩进技巧等方式。
3)注释:为便于易读,需大量使用清晰的、明确的注释。分两种:一种是序言式,它标注在每个文件或模块的开始部分,内容包括:模块的功能;模块的接口;重要的局部变量;开发日志等
(2)易测试性,由于在测试之前的各阶段软件都可能遗留下许多错误和缺陷,如果不及时找出这些错误和缺陷并将其改正,这个产品就不能正常使用甚至带来巨大损失。测试工作是一项很艰苦的工作,其工作量约占软件开发总工作量的40%以上甚至更高,因此开发人员应给予测试相当的重视。如果开发人员意识不到这点或忽视了软件测试就不能算是个成功的软件开发人员。
测试一般分为两类:白盒测试及黑盒测试。白盒测试是把程序看成装在一只透明的盒子里,要求测试者完全了解程序的结构和处理过程,检查程序中逻辑通路是否按设计要求正常工作。黑盒测试是把程序看成一个黑盒子,测试者完全不了解程序结构和处理过程。它根据规格说明书规定的功能来检查是否符合规格要求。
(3)易修改性,主要是为改正错误或功能完善和扩充时,程序应是易于修改的,这需要在设计程序时尽量考虑到模块的扩充及模块的通用上,同时程序的易读性也为修改带来方便。为以后的修改和扩充做铺垫。
3.移植魅力
移植魅力,是指程序功能复用,能从一个环境移植到另一个环境上,可以采用信息隐藏原则、模块化设计等都有利于程序的移植。大量使用子程序设计方法,或改造为面向对象的设计方法来编写汇编语言也会大大加强它的移植功能。
四、总结
上面所述实际上是把汇编语言的编程过程“工程”化,采用了软件工程的方法,以写出高质量的程序、改善汇编的弱点为目标,说明了几个行之有效的方法,充分发挥了汇编特有的魅力。
[1]李朝青.单片机原理及接口技术[M].北京:北京航空航天大学出版社,1999.
[2]钱能.C++程序设计教程[M].北京:清华大学出版社,1999.
[3]张海藩.软件工程导论(第四版)[M].北京:清华大学出版社,2003.