找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 25020|回复: 19
收起左侧

教你如何用汇编写51单片机程序之模块化程序

  [复制链接]
ID:262 发表于 2014-10-21 01:19 | 显示全部楼层 |阅读模式
    最近研究了一下51汇编指令系统。由于用C语言写程序,容易上手,开发效率高,所以之前一直用C写程序。在写C程序的时候,我习惯使用模块化编程,这极大地方便了代码的管理。又因为大二学习了8086汇编系统,在实验指导书上也使用了模块化编程,于是我想,51汇编应该也可以使用模块化编程。为了搞懂51汇编结构化编程,我浏览了很多论坛,也下载不少的资料,但是基本上没有哪个论坛或网站讲到模块化编程,这浪费我不少时间。皇天不负有心人,就在今天早上,在我头脑比较清醒的时候,我找到了一份资料,并将其精简,写成大家容易理解的文字。当然,写这些并不是为了说明我有多么的刻苦,而是为了告诉大家,找个好资料不简单,写这个教程可以节省大家的时间,只需要逛一下我的空间就可以轻松地学习新的知识。好了,吹牛吹过头了,咱们言归正传。

        我之前写过一篇《教你如何高效编程之头文件书写》的文章,已经了解C语言模块化编程或者看过我写过的那篇文章就可以很容易了解我下面将写到的汇编模块化编程了,这是我们《单片机实验指导书》上面的实验一,我将其写成模块化编程结构以供大家参考。
一、主程序的书写
        
                 

        如上图就是结构化编程的截图,里面的.asm即是
汇编文件的扩展名,C语言用的是.c 。在汇编语言中,头文件的扩展名是.inc,而在C语言中头文件的扩展名是.h。
        仔细观察上图,汇编包含头文件的格式是$include(头文件完整名称),而在C语言中是#include“头文件完整名称”,二者有着非常相似之处。ORG 0000H ; LJMP MAIN应该不用我解释是有什么作用的吧?ORG指令就是指定其下面一条指令或数据的首字节按ORG后面的地址或标号存放到相应的存储单元。_MAIN_ASM SEGMENT CODE; RSEG  _MAIN_ASM的作用上图已经标明了,也不用多讲,需要说明的是,_MAIN_ASM不一定要写成这样,你喜欢写什么符号都可以(如:MAINFUNC、_MAIN_FUNC、ZHUHANSHU,最后一个举例有点俗了),只要符合汇编语言变量或标号的命名规则即可。如果讲求规范,最好就按以上格式书写。
还有一点就是,这段动态分配程序地址的代码可以省略,如果没有这段代码,编译器就不会动态分配程序地址了。主函数的功能大家肯定都能分析了,不然看这个教程也没什么意义了。
二、子程序的书写



        下面讲的是子程序如何书写,子程序是要被调用的,你必须告诉编译器其他模块可以调用子程序模块中的哪些程序,如上所示,DELAY1MS即是可被调用的延时函数,公共变量及函数声明用关键字PUBLIC,后面跟函数名(标号名)。动态分配程序地址可以省略,在main.asm中已经讲到了。注意,子程序模块最后一行要写一个END,没有这一句,编译器不会报错,但会出现警告,容易出现问题,为了规范编程,大家还是别偷懒了。



三、头文件的书写
        最后一点就是头文件的作用了,这跟C语言的作用一样,可以对变量或函数进行声明,这个程序比较简单,可以直接放到主程序中声明,如下图:

这样写之后,头文件的相关函数就要删掉了,不然编译器会报错,重复定义!
至此,一个简单的完整的汇编模块化编程就完成了,是不是很简单?
欢迎大家转载分享!

回复

使用道具 举报

ID:66501 发表于 2014-10-24 14:09 | 显示全部楼层
掘墓高手,专挖古墓,一挖一个坑,坑坑见墓。。
回复

使用道具 举报

ID:1 发表于 2014-10-30 01:38 | 显示全部楼层
写得很透彻  不错 顶一下
回复

使用道具 举报

ID:76408 发表于 2015-4-10 15:29 | 显示全部楼层
谢谢,学习了!
回复

使用道具 举报

ID:77081 发表于 2015-4-15 21:00 | 显示全部楼层
很好很强大。学习了。。。。
回复

使用道具 举报

ID:77081 发表于 2015-4-15 21:01 | 显示全部楼层
很好很强大。学习了。。。。
回复

使用道具 举报

ID:143389 发表于 2016-10-19 12:11 | 显示全部楼层
假如我想2个短小程序放在一个文件里,行不?
回复

使用道具 举报

ID:149642 发表于 2016-11-24 09:56 | 显示全部楼层
如果是小白的话看不懂,我虽然看懂了,但也是看INCLUDE和PUBLIC 明白的,你的图里2个inc头文件,外部函数的申明说的有点矛盾,还有和c语言一样?抱歉!没学过c
回复

使用道具 举报

ID:154505 发表于 2016-12-13 19:36 | 显示全部楼层
很好的教程,给出两点补充:
1、keil里的伪指令可以把org替换成cseg。
2、另外可以用定义代码段的方法定义数据段,在数据段内定义变量,使编译器动态分配变量在内存中的地址。
回复

使用道具 举报

ID:448822 发表于 2019-3-28 14:37 | 显示全部楼层
不错 顶一下
回复

使用道具 举报

ID:237218 发表于 2019-8-4 12:44 | 显示全部楼层
好贴!!这些资料好难找
回复

使用道具 举报

ID:655758 发表于 2019-12-4 10:35 | 显示全部楼层
这个资料太及时了
回复

使用道具 举报

ID:398465 发表于 2020-3-18 16:14 | 显示全部楼层
mark一下
回复

使用道具 举报

ID:709162 发表于 2020-3-19 00:35 来自手机 | 显示全部楼层
很好,学习了
回复

使用道具 举报

ID:286147 发表于 2020-3-19 10:08 | 显示全部楼层
汇编运行效率高,但是写起来太慢。一直想学习一下用混合C比较好
回复

使用道具 举报

ID:237218 发表于 2020-6-28 18:14 | 显示全部楼层
学习了,这个资料实在是太少了,汇编的extern是什么意思,也是蓝字,一直没发现哪里写错了,这个是extrn
回复

使用道具 举报

ID:495287 发表于 2020-6-29 13:14 | 显示全部楼层
谢谢,后面正有计划准备转汇编,把手头的事忙完先。
回复

使用道具 举报

ID:485724 发表于 2020-7-22 18:54 | 显示全部楼层
好东西大家多捧捧场!
回复

使用道具 举报

ID:61140 发表于 2022-5-19 21:41 | 显示全部楼层
fangcheng1976 发表于 2020-3-19 10:08
汇编运行效率高,但是写起来太慢。一直想学习一下用混合C比较好

这样说太片面了,汇编写起来不一定慢看哪些方面了
回复

使用道具 举报

ID:887371 发表于 2022-5-20 08:51 | 显示全部楼层
楼主这技巧我曾经用过。
用12T的51mcu做滚动码的编解码,在12MHz下,用纯C语言写,编解码时间在1000ms左右。
仅写了左移和右移2个汇编代码,混合编译,使解码时间小于400ms。
再把密钥定义在bdata区,使用为变量操作,使解码时间小于50ms。

1秒时间太长了,用户明显不能接受。经过上述处理后,50ms能满足用户需求了。
现在有1T的mcu,晶振还可以做得更高,就是不使用上述技巧,也能满足用户需求了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表