汇编程序模块化设计

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

 

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

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:

 

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

关键字:汇编程序  模块化

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/article_2016092529792.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:单片机的加减法原理
下一篇:单片机page和bank切换问题

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

Keil下ARM汇编程序建立与调试简介

1. 新建工程选择目标处理器 比如:SAMSUNG /S3C24102. 新建文件保存SAVE3. 把文件添加入工程或者双击组文件夹,选择你保存的文件4. 设置工程属性  5. 编辑代码6. build7. debug8. 调试方法简介窗口1汇编代码编辑窗口窗口2单步调试工作栏,也可以按快捷键F11或F10窗口3 是程序执行时的寄存器窗口,Supervisor 高黑,说明当前CPU处于Supervisor工作模式,(CPU的工作模式介绍参考博文:arm处理器工作模式)Current代表当前模式下各个寄存器的值。窗口4 反汇编窗口,可以看代程序执行时的取值地址、机器码、以及机器码对应的汇编语言
发表于 2018-12-14
Keil下ARM汇编程序建立与调试简介

s3c2440的LED点灯裸机汇编程序

了后续编译出来的内容放在代码段【可执行】;.global 告诉编译器后续跟的是一个全局可见的名字【可能是变量,也可以是函数名】;在本例中,_start是一个函数的起始地址,也是编译、链接后程序的起始地址。由于程序是通过加载器来加载的,必须要找到 _start名字的函数,因此_start必须定义成全局的,以便存在于编译后的全局符合表中,供其它程序【如加载器】寻找到。2.上面汇编代码对应的makefileled_on.bin : led_on.S arm-linux-gcc -g -c -o led_on.o led_on.S arm-linux-ld -Ttext 0x0000000 -g led_on.o -o
发表于 2018-06-04

STM32 启动汇编程序详解

,并在执行main函数前初始化系统时钟;* -设置向量表入口为异常事件的入口地址;* -复位之后处理器为线程模式,优先级为特权级,堆栈设置为MSP主堆栈;*Stack_Size      EQU     0x00000200  ;定义堆栈的大小;AREA 命令指示汇编器汇编一个新的代码段或数据段。;段是独立的、指定的、不可见的代码或数据块,它们由链接器处理.;段是独立的、命名的、不可分割的代码或数据序列。一个代码段是生成一个应用程序的最低要求;默认情况下,ELF 段在四字节边界上对齐。expression 可以拥有 0 到 31
发表于 2018-05-20

P89LPC932A1测脉冲宽度汇编程序

/********************CCU_Capture.asm***************************;程序功能:对一方波的每一次电平跳变进行捕获,并用捕获值计算方波的脉冲宽度,占空比,周期或其他。;************************************************************/$NOMOD51$INCLUDE(REG932.INC)ICRAH_DAT1 DATA 41H  ;第一次捕获值高字节ICRAL_DAT1 DATA 42H  ;第一次捕获值低字节ICRAH_DAT2 
发表于 2018-04-12

DS18B20汇编程序与C程序

;     // Skip ROMwrite_byte(0xBE);          // Read Scratch Padtemp.c[1]=read_byte();temp.c[0]=read_byte();ow_reset();write_byte(0xCC);          //Skip ROMwrite_byte(0x44);            // Start Conversionreturn temp.x/2;}ds18b20汇编程序
发表于 2018-03-12

时钟,秒表,流水灯的单片机汇编程序

 //HJSMSY-V1.0单片机开发板测试程序//---------------------------------------------//          <<电脑钟>>//---------------------------------------------    //=======主函数==================================ORG  0000H    LJMP  MAIN    ORG   
发表于 2018-03-07

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved