关注+星标公众,不错过精彩内容

作者 | strongerHuang

微信公众号 | 嵌入式专栏

现在可能很少看到汇编程序了,但单片机的启动文件、RTOS底层代码等一些地方,依然还有汇编代码的身影。

不知道大家有没有学过汇编,或者有没有用汇编语言编过程?

今天就给大家分享一下汇编语言的那些事。

嵌入式专栏

1

学习汇编语言

我在10年学习单片机编程的时候,老师教学都还是用汇编教我们,包括教学实验,也是要求我们用汇编写程序。

MOV  A,#00H
MOV  P1,A

我记得那会儿,老师要求我们把汇编指令背下来。虽然现在很多汇编指令写不出来了,但看到很多汇编代码,还是基本明白它的意思。

以前计算机三级(PC技术)的上机考试,就是用汇编编程,我那个时候上机考试还是满分。当时觉得自己很牛逼,现在看来就是一菜鸟

嵌入式专栏

2

汇编转C语言

刚开始学习汇编那会儿,我真的用汇编在51单片机上写流水灯程序。后面看了用C语言写流水灯程序,突然发现,哇,用C语言写程序还能这么简单、方便。

于是,我就那个时候开始放弃了汇编,转向了C语言。包括后面我在大学实验室自己学习、DIY做东西、以及后面的全国大学生电子设计竞赛,都是用C语言编写的程序。

10行汇编程序,可能只需要一行C语言代码就能实现,这是C语言相比汇编简化的优点。

但是,C语言编写的程序,经过编译,也会转为汇编。比如我们在线调试代码的时候,会看到类似的“汇编窗口”:

因为以前单片机的运行速度不高,且内存和Flash容量不大,要求节约程序空间。

所以使用汇编的优点:代码运行效率更高、更节约代码存储空间

嵌入式专栏

3

对比用汇编和C语言写流水灯程序

汇编语言写程序的主要缺点:语法复杂、可读性差、代码量大等。

下面分享一个实例:51单片机上的流水灯程序。分别用C语言和汇编写出来,大家对比一下就知道了。

C语言版:

/******************** 宏定义 **************************/
#define   MAIN_Fosc    22118400L  //定义主时钟/******************** 延时函数 **************************/
void  delay_ms(u8 ms)
{u16 i;do{i = MAIN_Fosc / 13000;while(--i)  ;   //14T per loop}while(--ms);
}/******************** 主函数 **************************/
void main(void)
{P0M1 = 0;  P0M0 = 0;  //设置为准双向口P1M1 = 0;  P1M0 = 0;  //设置为准双向口P2M1 = 0;  P2M0 = 0;  //设置为准双向口P3M1 = 0;  P3M0 = 0;  //设置为准双向口P4M1 = 0;  P4M0 = 0;  //设置为准双向口P5M1 = 0;  P5M0 = 0;  //设置为准双向口P6M1 = 0;  P6M0 = 0;  //设置为准双向口P7M1 = 0;  P7M0 = 0;  //设置为准双向口while(1){P17 = 0;delay_ms(250);delay_ms(250);P17 = 1;P16 = 0;delay_ms(250);delay_ms(250);P16 = 1;P47 = 0;delay_ms(250);delay_ms(250);P47 = 1;P46 = 0;delay_ms(250);delay_ms(250);P46 = 1;}
}

汇编语言版:

;******************** 宏定义 **************************/
Fosc_KHZ  EQU  22118  ;22118KHZSTACK_POIRTER  EQU    0D0H  ;堆栈开始地质;******************** 延时函数 **************************/
F_delay_ms:PUSH  02H    ;入栈R2PUSH  03H    ;入栈R3PUSH  04H    ;入栈R4MOV    R2,AL_delay_ms_1:MOV    R3, #HIGH (Fosc_KHZ / 13)MOV    R4, #LOW (Fosc_KHZ / 13)L_delay_ms_2:MOV    A, R4      ;1T    Total 13T/loopDEC    R4        ;2TJNZ    L_delay_ms_3  ;4TDEC    R3
L_delay_ms_3:DEC    A        ;1TORL    A, R3      ;1TJNZ    L_delay_ms_2  ;4TDJNZ  R2, L_delay_ms_1POP    04H    ;出栈R2POP    03H    ;出栈R3POP    02H    ;出栈R4RET;******************** 主程序 **************************/ORG    0100H    ;reset
F_Main:CLR    AMOV    P0M1, A   ;设置为准双向口MOV    P0M0, AMOV    P1M1, A   ;设置为准双向口MOV    P1M0, AMOV    P2M1, A   ;设置为准双向口MOV    P2M0, AMOV    P3M1, A   ;设置为准双向口MOV    P3M0, AMOV    P4M1, A   ;设置为准双向口MOV    P4M0, AMOV    P5M1, A   ;设置为准双向口MOV    P5M0, AMOV    P6M1, A   ;设置为准双向口MOV    P6M0, AMOV    P7M1, A   ;设置为准双向口MOV    P7M0, AMOV    SP, #STACK_POIRTERMOV    PSW, #0    ;选择第0组R0~R7L_MainLoop:CLR    P1.7MOV    A, #250LCALL  F_delay_ms    ;延时250msLCALL  F_delay_ms    ;延时250msSETB  P1.7CLR    P1.6MOV    A, #250LCALL  F_delay_ms    ;延时250msLCALL  F_delay_ms    ;延时250msSETB  P1.6CLR    P4.7MOV    A, #250LCALL  F_delay_ms    ;延时250msLCALL  F_delay_ms    ;延时250msSETB  P4.7CLR    P4.6MOV    A, #250LCALL  F_delay_ms    ;延时250msLCALL  F_delay_ms    ;延时250msSETB  P4.6SJMP  L_MainLoop

上面两个程序,实现的功能都一样(流水灯),但对比代码,大家发现有啥区别?

对于有汇编基础的同学来说,可能这个简单的流水灯程序还是很好理解。

但是,对于大部分人来说,肯定都会觉得汇编很难读。是的,这个是汇编的“特点”。

嵌入式专栏

4

最后

汇编语法,对于绝大部分读者来说,我现在是不建议再深入学习了,只需要了解一些基础的内容即可。

有少部分人,想从事底层开发,比如底层驱动、单片机验证、固件库开发等这些读者,有时间还是可以进一步了解汇编的一些技术。

------------ END ------------

后台回复『嵌入式C语言』『嵌入式软件基础知识』相关文章。

欢迎关注我的公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

欢迎关注我的视频号:

点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。

如何在单片机中用汇编优雅的点灯相关推荐

  1. 单片机实验汇编2--P1口输入、输出实验

    P1口输入.输出实验 一.实验要求 1.P1口做输出口,接八只发光二极管,编写程序,使发光二极管循环点亮. 2.P1口做输入口,接八个扭子开关,以实验机上74LS273做输出口,编写程序读取开关状态, ...

  2. 8051(c51)单片机从汇编到C语言,从Boot到应用实践教程

    8051(c51)单片机从汇编到C语言,从Boot到应用实践教程 作者 将狼才鲸 创建日期 2022-09-29 本仓库相关网址: CSDN文章地址 Gitee工程和源码地址 相关仓库: 嵌入式整体介 ...

  3. 传统 51 与STC-Y5内核 51 单片机对比汇编指令

    传统 51 与STC-Y5内核 51 单片机对比&汇编指令 算术类指令 24 汇编助记符 功能说明 字节数 传统8051单片机所需时钟 STC 8051单片机所需时钟 ADD A,Rn 寄存器 ...

  4. 【单片机】汇编指令入门学习|单片机启动代码汇编

     目录 汇编指令入门学习 [汇编指令]MSP430汇编指令 IAR下的汇编/单片机启动代码汇编 ARM 汇编&ARM 指令集 学习笔记 汇编指令入门学习   在进行汇编程序设计时,MSP430 ...

  5. keil c支持汇编语言吗,keil中用汇编实现hello.c的功能

    C51编译器能对C语言程序进行高效率的编译,生成高效简洁的代码,在大多数的应用场合,采用C语言编程即可完成预期的任务,但是,在有些场合还是会用到汇编,例如在下面的几种情况下,采用汇编可能会有很多好处: ...

  6. 应广单片机入门之_按键点灯

    为了能够使初学者能够有感性认识,现在做了一个阻塞式编程的按键点灯版本.不多说,上代码 #include    "extern.h" /*端口定义*/ BIT     LED     ...

  7. 基于51单片机的汇编/C程序:拨码开关控制八位LED实现流水灯

    基于51单片机的汇编程序:拨码开关控制八位LED实现流水灯 2022-03-08,51单片机学习笔记 功能 打开K1循环左移,打开K2循环右移,打开K3两侧到中心来回点亮,打开K4单双数位置交替点亮. ...

  8. 在项目实践中用更优雅的方式处理数组问题

    在最近的项目中,遇到了比较多处理数组的场景,比如要对数组里面某个元素的某一个字段进行抽取归类,或者判断数组当中的某个元素是否符满足判断条件等. 网上关于使用ES5新的的API来代替for循环的文章已经 ...

  9. 新唐 N76E003 单片机8051汇编 PWM测试程序

    ;测试PWM5输出端口P0.3,LED闪烁端口是P1.5 ;以下是汇编代码 ;功能寄存器定义 SFRS    EQU    91H TA        EQU    0C7H PWMCON0    E ...

  10. 单片机实验汇编案例---单片机串行口与PC机通讯实验

    一.实验要求 利用8031单片机串行口,实现与PC机通讯. 本实验实现以下功能,将从实验机键盘上键入的数字,字母显示到PC机显示器上,将PC机键盘输入的字符(0-F)显示到实验机的数码管上. 二.实验 ...

最新文章

  1. 【HTML】------HTML的标签
  2. oracle11g同步,Oracle11g三种数据同步方式-Oracle
  3. 【JavaScript】关于delete
  4. java 和mysql 时间_java和mysql之间的时间日期类型传递
  5. 【爬虫剑谱】三卷2章 拾遗篇-有关于re库的使用小结
  6. java自带的字节码技术_读懂字节码-还原JAVA源码
  7. 【转】使用C语言实现MD5消息摘要算法
  8. 最好用的 网络神偷V10.7
  9. 安卓上的测试软件有哪些,手机硬件检测软件有哪些
  10. 免费下载微软原厂Win11镜像ISO文件
  11. 奥卡姆剃刀定律(Occam‘s Razor)
  12. Flutter InAppWebView 软键盘问题
  13. mysql单表瓶颈_mysql单表性能瓶颈_优化系列 | 实例解析MySQL性能瓶颈排查定位-云栖社区-阿里云...
  14. crontab命令不执行
  15. 拓嘉辰丰电商:拼多多服务激励分有什么意义?怎样查看
  16. bootstrap导航窗格响应式二级菜单
  17. Hive建表(分区表、非分区表)实例
  18. windbg r eip=0xxxxxxxxx如何实现?
  19. 【Python】Matplotlib绘制折线图
  20. python画结节图像_天池医疗AI大赛[第一季]:肺部结节U-Net图像分割

热门文章

  1. 十大中文搜索引擎排名,头一个你绝对意想不到!
  2. NLP学习(七)使用stanford实现句法分析-Python3实现
  3. 怀旧--这些游戏你都玩过么?还记得么?
  4. 传说中的考研神校,考研人数究竟有多高?
  5. 计算机管理 未分配磁盘,磁盘显示未分配怎么办?
  6. android exif 相册,android 读取图片 EXIF信息
  7. oppo怎么广告接入_oppo搜索广告投放操作指南
  8. 基于动态超图卷积网络的地铁客流预测
  9. 统一资源定位符URL和统一资源标识符URI
  10. bugzilla安装