C语言入门到精通之用汇编和C语言 写流水灯程序
小职 2021-05-10 来源 :嵌入式专栏 阅读 1161 评论 0

摘要:本文主要介绍了C语言入门到精通之用汇编和C语言 写流水灯程序,通过具体的内容向大家展现,希望对大家C语言开发的学习有所帮助。

本文主要介绍了C语言入门到精通之用汇编和C语言 写流水灯程序,通过具体的内容向大家展现,希望对大家C语言开发的学习有所帮助。

C语言入门到精通之用汇编和C语言 写流水灯程序


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

 

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

 

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

 

1学习汇编语言

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

 

MOV  A,#00H

MOV  P1,A

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

 

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

 

2汇编转C语言

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

 

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

 

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

 

但是,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

  DEC    R4        ;2T

  JNZ    L_delay_ms_3  ;4T

  DEC    R3

L_delay_ms_3:

  DEC    A        ;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最后

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

 

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


我是小职,记得找我

✅ 解锁高薪工作

✅ 免费获取基础课程·答疑解惑·职业测评

C语言入门到精通之用汇编和C语言 写流水灯程序

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程