现在可能很少看到汇编程序了,但单片机的启动文件、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  ;22118KHZ

STACK_POIRTER  EQU    0D0H  ;堆栈开始地质

;******************** 延时函数 **************************/

F_delay_ms:

PUSH  02H    ;入栈R2

PUSH  03H    ;入栈R3

PUSH  04H    ;入栈R4

MOV    R2,A

L_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/loop

DECR4        ;2T

JNZ    L_delay_ms_3  ;4T

DECR3

L_delay_ms_3:

DECA        ;1T

ORL    A, R3      ;1T

JNZ    L_delay_ms_2  ;4T

DJNZ  R2, L_delay_ms_1

POP    04H    ;出栈R2

POP    03H    ;出栈R3

POP    02H    ;出栈R4

RET

;******************** 主程序 **************************/

ORG    0100H    ;reset

F_Main:

CLR    A

MOV    P0M1, A   ;设置为准双向口

MOV    P0M0, A

MOV    P1M1, A   ;设置为准双向口

MOV    P1M0, A

MOV    P2M1, A   ;设置为准双向口

MOV    P2M0, A

MOV    P3M1, A   ;设置为准双向口

MOV    P3M0, A

MOV    P4M1, A   ;设置为准双向口

MOV    P4M0, A

MOV    P5M1, A   ;设置为准双向口

MOV    P5M0, A

MOV    P6M1, A   ;设置为准双向口

MOV    P6M0, A

MOV    P7M1, A   ;设置为准双向口

MOV    P7M0, A

MOV    SP, #STACK_POIRTER

MOV    PSW, #0    ;选择第0组R0~R7

L_MainLoop:

CLR    P1.7

MOV    A, #250

LCALL  F_delay_ms    ;延时250ms

LCALL  F_delay_ms    ;延时250ms

SETB  P1.7

CLR    P1.6

MOV    A, #250

LCALL  F_delay_ms    ;延时250ms

LCALL  F_delay_ms    ;延时250ms

SETB  P1.6

CLR    P4.7

MOV    A, #250

LCALL  F_delay_ms    ;延时250ms

LCALL  F_delay_ms    ;延时250ms

SETB  P4.7

CLR    P4.6

MOV    A, #250

LCALL  F_delay_ms    ;延时250ms

LCALL  F_delay_ms    ;延时250ms

SETB  P4.6

SJMP  L_MainLoop

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

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

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

4最后

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

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

【编辑推荐】

【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0

c语言写流水灯程序,用汇编和C语言 写流水灯程序相关推荐

  1. 四,中断:中断程序(汇编和C语言)、idt、IDTR、8259A、8253以及发生中断时候的压栈细节和特权级保护

    中断: 由于CPU获知了计算机中发生的某些事,CPU暂停正在执行的程序,转而去执行处理该事件的程序,当这段程序执行完毕后,CPU继续执行刚才的程序,整个过程称为中断处理,也称为中断.没有中断,操作系统 ...

  2. sja1000 c语言,调试好的can(汇编及C语言)程序,sja1000+tja1040

    调试好的can(汇编及C语言)程序,与大家分享! //************************************程序功能********************************* ...

  3. 汇编调用c语言函数 call printf,如何在汇编调用c语言函数?

    一. 参数传递的基本规则(ATPCS(ARM-Thumb Procedure Call Standard)) 1. 参数传递 二.汇编程序.C程序相互调用举例 1. C程序调用汇编程序 汇编程序的设计 ...

  4. 基于汇编和C语言STM32流水灯依次闪烁

    目录 一.初始化 1.地址映射和寄存器映射 1.1 总线基地址 1.2 外设基地址 1.3 外设寄存器地址 1.4接线 1.4.1 将串口USB转TTL线与stm32核心板连接如图所示 1.4.2 并 ...

  5. c语言流水灯程序详细讲解,用c语言编写单片机流水灯程序详解

    用C语言编写的单片机流水灯程序 一.硬件电路 因为电路用单片机控制,所以电路非常简洁.其电路原理图见下图,印制板图如下图所示. ? 电路的核心部分是AT89C2051单片机,前面提到它有Pl和P3两组 ...

  6. 单片机c语言程序编写步骤,用c语言编写单片机流水灯程序详解

    用C语言编写的流水灯程序 一.硬件电路 因为电路用单片机控制,所以电路非常简洁.其电路原理图见下图,印制板图如下图所示. 电路的核心部分是AT89C2051单片机,前面提到它有Pl和P3两组I/O口, ...

  7. keil流水灯c语言程序两个一起亮,我用keil c51编了一个流水灯程序,编译无误却只有第一和第二个灯亮了,最后停在第一个灯处不动...

    满意答案 zJ张俭 2014.02.09 采纳率:43%    等级:12 已帮助:10469人 你有几个错误: 1 你的定时器没有重装,导致第一次中断和后面的中断时间不一样,第一次时间短,后面的时间 ...

  8. 用c语言完成流水灯控制的程序设计,单片机C语言程序设计之TIMER0控制流水灯

    描述 基于单片机的LED流水灯的应用十分广泛,由单片机作为的核心控制器,通过按键实现控制功能和数据输入是非常普遍的.通常在所需按键数量不多时,系统常采用独立式按键.这种按键的电路配置灵活,软件结构简单 ...

  9. 独立式键盘实验c语言,单片机设计报告—独立式键盘控制的4级流水灯.doc

    单片机设计报告-独立式键盘控制的4级流水灯 单片机结题报告 独立式键盘控制的4级流水灯 班 级 姓 名 吴泽宇 学 号 2008405340 一.任务目的: 通过采用单片机制作一个独立式键盘控制的4级 ...

  10. 两小灯同亮同灭c语言程序,基于C语言与Proteus联合仿真的单片机技术最新章节_何波,丘利丽著_掌阅小说网...

    前言 随着嵌入式技术的飞速发展,嵌入式系统产品正不断渗透到各行各业,如智能家居.车载电子设备等.因此,单片机技术作为嵌入式计算机控制系统的重要技术,已经越来越受到各个应用领域的重视,尤其对于直接面向企 ...

最新文章

  1. oraclexe支持商用吗_商用车线控制动系统项目 技术研发
  2. 实战解读ASP.NET Core身份认证
  3. 组件通信-父组件为子组件传递数据-静态数据//动态数据 // 数据校验
  4. 软件开发丨关于软件重构的灵魂四问
  5. python统计缺失值
  6. 17. GD32F103C8T6入门教程-adc 使用教程2-dma+连续扫描方式采集数据++dma中断通知
  7. flux服务器推消息,服务端主动推送数据,除了 WebSocket 你还能想到啥?
  8. [luogu3244 SHOI2016] 黑暗前的幻想乡(容斥原理+矩阵树定理)
  9. 时代变了,199 美元的 iPhone 都可以想了?
  10. Docker 快速安装 Mysql
  11. 计算机毕业设计中Java编程案例之学生管理系统
  12. 并发编程之多线程基础-Thread和Runnable的区别及联系(二)
  13. python截取某一段文字分栏_Python文本数据互相转换(pandas and win32com)
  14. 关于CefSharp在客户端运行报错的解决方案
  15. Java-密钥keytool及KeyStore的使用
  16. 信息学奥赛一本通1011
  17. 自动化专业好找工作吗?就业方向是什么?
  18. vs2010中, 注释导致的怪异现象
  19. Java程序员辛勤工作7年被裁,背后的思考与总结
  20. 程序员噩梦typescript+vue3

热门文章

  1. 揭秘世界最大对撞机:将破解五大科学谜团(图)
  2. 计算机辅助翻译和人工翻译的优缺点,计算机辅助翻译的利与弊以及解决方案
  3. 他因“上帝粒子”获诺奖,却火速搬到乡下:它毁了我的生活
  4. indesign排版标点挤压_孔雀计划序——中文排版思路的重建
  5. 看完即会,抓取微信小程序数据包教程
  6. nii、npz、npy、dcm、mhd 的数据互转处理,及多目标分割处理汇总
  7. Webstorm查找替换快捷键
  8. Linux常用命令分享
  9. excel区别奇偶行(删除、过滤)
  10. 求斐波那契数列的特征方程和通项公式