汇编程序模块化设计
单片机程序很容易写,但是怎么写的好确实需要经验积累,技巧的积累。很多时就是一个新手和一个老手的区别所在。好的单片机程序要做到以下几点:
C语言的话还是有些书去介绍怎么设计程序,但是汇编的书籍除了介绍指令集,根本没有去介绍汇编程序的一些设计思想,小技巧等。掌握一些技巧后,发现学习汇编其实并不难。
可能学C语言的时候接触过模块化的概念,其实汇编也需要模块化。代码应该是一个 block 为单位的,例如C语言的函数,严格规定统一的“入口”“出口”,这样的代码让人看起来清晰,代码可靠,维护方便。模块应该是一个独立的整理,和外界的联系只能够通过模块的入口和出口,少用或者不用全局变量。
目标:如果你的汇编写的很像C 那么你就理解了什么叫模块了。
例如看下面的一个例子:
(注释:xxx表示一行或者多行代码)
-----------------------------------------------------程序块一
Label1 :
xxxxxxx
jbs flag 如果满足条件
Jmp Label2 则跳出程序块一,继续执行下面的程序
Xxxxxxx
-----------------------------------------------------程序块二
Label2 :
Xxxxxxxx
Lable3 :
XXXXXX
意图很简单,Label1 先执行一段程序,然后条件判断跳转到 Label2 。这样写无疑能完成程序需要的逻辑,但是这样好不好?为什么?
我们说,这样处理是不好的,为什么?我们可以先看一个例子,如果程序块一需要移动,那么看发生什么事情,事实上这是非常常见的
-----------------------------------------------------程序块二
Label2 :
Xxxxxxxx
-----------------------------------------------------程序块一
Label1 :
xxxxxxx
jbs flag
Jmp Label2
Xxxxxxx
Lable3 :
XXXXXX
看出没有,逻辑变了!!!程序本来的意图是跳出程序块一,继续执行下面的程序的,但是移动了之后发现程序块一中的跳转地址依然是跳到程序块二的入口,很容易会形成一个死循环,违背的当初的意图。当然有人肯定会说:“这很简单啊,我修改一下”
jbs flag
Jmp Label3
这样程序不是一样可以正常的跑吗?对的,你没有错。但是问题是,你每移动一次程序块,都在这里修改标号,工作量大,容易出错,在实际维护程序中,简直就是一场噩梦。
这就是我今天想说的,就叫模块间“耦合”。一个模块和其他模块发生了互联关系,使得两个程序都不能很好的独立出来。
怎么处理这个问题?看例子:
-----------------------------------------------------程序块一
Label1 :
xxxxxxx
jbs flag
Jmp Label1_end
Xxxxxxx
Label1_end:
-----------------------------------------------------程序块二
Label2 :
Xxxxxxxx
这个程序只做了很小的修改, jmp 指令跳出的不是原来的 Label2,而修改为在原来的模块一中的结尾处的 Label1_end 标号处。可以理解不?这样程序块一就完全的独立起来了,他和程序中的其他模块一点关系都没有。如果我要移动一下:
-----------------------------------------------------程序块二
Label2 :
Xxxxxxxx
-----------------------------------------------------程序块一
Label1 :
xxxxxxx
jbs flag
Jmp Label1_end
Xxxxxxx
Label1_end:
这次好多了,我们发现根本不需要修改代码,原来的程序就运行的很好。或者这只是一个微不足道的小例子,但是我想说的是,从这个小例子中体验到模块化程序的重要性。当然了,这个是最基本的技巧。
汇编程序模块 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)