0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式开发还有必要学汇编吗?

strongerHuang 来源:嵌入式专栏 2023-07-10 11:22 次阅读

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

最近又看到关于【嵌入式开发有没有必要学汇编话题 我觉得学汇编有学汇编的道理,不学也有不学的道理,这个很正常。不同的人有不同的观点,讨论激烈也很正常。 现在可能很少看到汇编程序了,但单片机的启动文件、RTOS底层等一些地方,依然还有汇编代码的身影。 不知道大家有没有学过汇编,或者有没有用汇编语言编过程? 下面结合我学习汇编的经历,以及汇编点灯给大家说说。

学习汇编语言

我在2010年学习单片机编程的时候,老师教学都还是用汇编教我们,包括教学实验,也是要求我们用汇编写程序。
MOV  A,#00H
MOV  P1,A
我记得那会儿,老师要求我们把汇编指令背下来。虽然现在很多汇编指令写不出来了,但看到很多汇编代码,还是基本明白它的意思。 以前计算机三级(PC技术)的上机考试,就是用汇编编程,我那个时候上机考试还是满分。当时觉得自己很牛逼,现在看来就是一菜鸟

汇编转C语言

刚开始学习汇编那会儿,我真的用汇编在51单片机上写流水灯程序。后面看了用C语言写流水灯程序,突然发现,哇,用C语言写程序还能这么简单、方便。 于是,我就那个时候开始放弃了汇编,转向了C语言。包括后面我在大学实验室自己学习、DIY做东西、以及后面的全国大学生电子设计竞赛,都是用C语言编写的程序。 10行汇编程序,可能只需要一行C语言代码就能实现,这是C语言相比汇编简化的优点。 但是,C语言编写的程序,经过编译,也会转为汇编。比如我们在线调试代码的时候,会看到类似的“汇编窗口”:0c18daa0-1eca-11ee-962d-dac502259ad0.png  因为以前单片机的运行速度不高,且内存和Flash容量不大,要求节约程序空间。 所以使用汇编的优点:代码运行效率更高、更节约代码存储空间

对比汇编和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
上面两个程序,实现的功能都一样(流水灯),但对比代码,大家发现有啥区别? 对于有汇编基础的同学来说,可能这个简单的流水灯程序还是很好理解。 但是,对于大部分人来说,肯定都会觉得汇编很难读。是的,这个是汇编的“特点”。

最后

汇编语法,对于绝大部分读者来说,我现在是不建议再深入学习了,只需要了解一些基础的内容即可。 有少部分人,想从事底层开发,比如底层驱动、单片机验证、固件库开发等这些读者,有时间还是可以进一步了解汇编的一些技术。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136120
  • 嵌入式开发
    +关注

    关注

    18

    文章

    1021

    浏览量

    47505
  • 代码
    +关注

    关注

    30

    文章

    4741

    浏览量

    68325

原文标题:嵌入式开发还有必要学汇编吗?

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式软件开发需要些什么知识?​

    CE。linux C linux shell 等都要会。另外,嵌入式肯定要的是arm,因为要以arm为平台开发项目。还有就是QTdesigner ,是做图形化界面用的,
    发表于 09-30 09:32

    嵌入式开发什么内容 嵌入式开发学习路线介绍

    ,创客学院嵌入式开发讲师在这里介绍嵌入式开发学习路线,希望对于嵌入式开发学习内容不了解的读者可以有所帮助。  嵌入式开发什么内容
    发表于 03-01 10:13

    嵌入式开发什么内容 嵌入式开发学习路线介绍

    客学院嵌入式开发讲师在这里介绍嵌入式开发学习路线,希望对于嵌入式开发学习内容不了解的读者可以有所帮助。嵌入式开发什么内容
    发表于 06-30 10:07

    嵌入式开发什么内容 嵌入式开发学习路线介绍

    学院嵌入式开发讲师在这里介绍嵌入式开发学习路线,希望对于嵌入式开发学习内容不了解的读者可以有所帮助。嵌入式开发什么内容
    发表于 07-27 09:49

    嵌入式开发什么?

      随着智能硬件的迅速发展,越来越多的人把目光投向了嵌入式开发,想要更快进入嵌入式开发领域,先来了解一下嵌入式开发什么?  以下是学员总结的心得,具体
    发表于 09-06 16:21

    嵌入式开发什么

    嵌入式开发哪些,嵌入式可以简单分为硬件与软件,然而其中的知识体系却是异常的庞大,这也是众多新手望而却步的一个原因,那究竟要如何才能成为一名嵌入式大咖呢?
    发表于 01-18 06:36

    嵌入式开发的基础知识和入门必要步骤

    ARM嵌入式开发嵌入式开发领略比较热门的技术,本文针对ARM嵌入式开发的入门者给出嵌入式开发的基础知识和入门必要步骤。1. 做个最小系统板
    发表于 12-14 07:32

    基于ARM的嵌入式开发

    基于ARM的嵌入式开发:华清远见/孙天泽基于ARM的嵌入式开发内容有:ARM简介,基于ARM的嵌入式产品,ARM架构,基于ARM的嵌入式开发
    发表于 10-04 08:49 83次下载

    嵌入式开发

    嵌入式开发就是指在嵌入式操作系统下进行开发嵌入式Linux是以Linux为基础的嵌入式作业系统。这里提供了
    发表于 12-20 13:21
    <b class='flag-5'>嵌入式开发</b>

    嵌入式开发入门_嵌入式开发需要看哪些书籍

    现在嵌入式开发越来越吃香,很多人都想要学习却不知道要从何下手。本文分析了学习嵌入式软件开发需要具备哪些基本知识和技能,开发学习的基本步骤,并给出了各种参考资料及网站,同时小编还推荐了学
    的头像 发表于 04-04 10:25 2.5w次阅读

    什么是嵌入式开发板_嵌入式用什么开发

    本文首先介绍了嵌入式开发板的功能作用,其次阐述了嵌入式用什么开发板,分别推荐了fs4412开发板、mini2440
    发表于 05-18 11:14 7091次阅读

    嵌入式开发什么嵌入式开发的一些入门教材推荐

    本文档的主要内容详细介绍的是嵌入式开发什么嵌入式开发的一些入门教材推荐资料免费下载教材包括了:ARM嵌入式项目开发三位一体实战精讲,C
    发表于 01-10 14:46 27次下载
    <b class='flag-5'>嵌入式开发</b>要<b class='flag-5'>学</b>什么<b class='flag-5'>嵌入式开发</b>的一些入门教材推荐

    嵌入式开发资料免费分享

    嵌入式开发资料免费分享嵌入式工程师经验分享:如何学习嵌入式开发截取文档部分学习嵌入式工程师经验分享的资料分享给大家,文档上从、嵌入式系统的概
    发表于 10-21 11:07 47次下载
    <b class='flag-5'>嵌入式开发</b>资料免费分享

    嵌入式开发培训什么?嵌入式开发板知识讲解

    嵌入式开发就是指在嵌入式操作系统下进行开发,一般常用的系统有WinCE,ucos,vxworks,linux,android等。另外,用c,c++或汇编
    发表于 11-02 20:21 16次下载
    <b class='flag-5'>嵌入式开发</b>培训<b class='flag-5'>学</b>什么?<b class='flag-5'>嵌入式开发</b>板知识讲解

    嵌入式学习培训能学会吗?嵌入式开发培训都要什么?

    嵌入式学习培训能学会吗?嵌入式开发培训都要什么?掌握Linux常用操作命令,与系统管理;理解嵌入式系统进程管理,文件管理,Linux内核;熟悉ARM在不同硬件平台下的操作系统移植和设
    发表于 11-03 10:06 15次下载
    <b class='flag-5'>嵌入式</b>学习培训能学会吗?<b class='flag-5'>嵌入式开发</b>培训都要<b class='flag-5'>学</b>什么?