×
嵌入式 > 技术百科 > 详情

汇编程序的模块化设计

发布时间:2020-06-11 发布时间:
|
单片机程序设计虽然小,可能很多人并不去注意项目开发的一些方法,方案拿到手就开始写,然后是想到什么地方,就写到什么地方,思绪凌乱,要将项目按时完成倒是没有问题,但是如果说后期的维护,修改等,就是噩梦了,更不用说让别人来维护代码了,因为自己看起来都吃力。

 

单片机程序很容易写,但是怎么写的好确实需要经验积累,技巧的积累。很多时就是一个新手和一个老手的区别所在。好的单片机程序要做到以下几点:

C语言的话还是有些书去介绍怎么设计程序,但是汇编的书籍除了介绍指令集,根本没有去介绍汇编程序的一些设计思想,小技巧等。掌握一些技巧后,发现学习汇编其实并不难。

 尽管单片机编程很小,但许多人可能并不注意某些项目开发方法。计划提交后,他们开始写,然后在他们认为的任何地方写,思想杂乱无章。按时完成项目没问题。但是,如果说以后的维护,修改等工作是一场噩梦,更不要说让其他人来维护代码了,因为它们看起来很费力。


SCM程序易于编写,但是如何编写好程序需要积累经验和技能。很多时候,这是新手和老手之间的区别。一个好的单片机程序必须执行以下操作:

在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:

 

这次好多了,我们发现根本不需要修改代码,原来的程序就运行的很好。或者这只是一个微不足道的小例子,但是我想说的是,从这个小例子中体验到模块化程序的重要性。当然了,这个是最基本的技巧。

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
星级酒店必须安装监控系统