iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >如何用汇编和C语言写流水灯程序
  • 762
分享到

如何用汇编和C语言写流水灯程序

2023-06-15 14:06:57 762人浏览 泡泡鱼
摘要

本篇内容介绍了“如何用汇编和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语言写流水灯程序

因为以前单片机的运行速度不高,且内存和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语言写流水灯程序”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 如何用汇编和C语言写流水灯程序

本文链接: https://www.lsjlt.com/news/280497.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c语言怎么计算字符串长度
    在C语言中,可以使用内置的strlen()函数来计算字符串的长度。该函数位于string.h头文件中。以下是一个示例代码: #inc...
    99+
    2024-05-15
    c语言
  • c语言怎么判断三个数的大小
    可以通过比较三个数之间的大小关系来判断它们的大小。以下是一个示例代码: #include <stdio.h> int ...
    99+
    2024-05-15
    c语言
  • c++排序函数sort怎么使用
    在C++中,使用sort函数对容器中的元素进行排序,可以按照默认的升序排列,也可以自定义排序规则。 下面是一个简单的例子,对一个ve...
    99+
    2024-05-15
    c++
  • c++中string的compare函数怎么使用
    在C++中,可以使用string的compare函数来比较两个string对象的大小。该函数的原型如下: int compare(c...
    99+
    2024-05-15
    c++
  • c++中string的compare函数有什么用
    c++中string的compare函数用于比较两个字符串的大小关系。该函数返回一个整数值,表示两个字符串的比较结果。 具体来说,如...
    99+
    2024-05-15
    c++
  • c++中print函数的功能有哪些
    在C++中,通常使用std::cout来进行输出操作,而不是使用print函数。std::cout是C++标准库中的一个输出流对象,...
    99+
    2024-05-15
    c++
  • c语言数据结构怎么使用
    在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
    99+
    2024-05-15
    c语言
  • c++中print函数的用法是什么
    在C++中没有内置的print函数,但可以使用cout来输出内容到控制台。cout是C++标准库中的一个输出流对象,可以使用<...
    99+
    2024-05-15
    c++
  • c++中concept的用法是什么
    在C++20中,Concept是一种新的语言特性,用于定义类型要求和约束。Concept可以被用来约束函数模板、类模板和普通函数的参...
    99+
    2024-05-15
    c++
  • c++中concept的作用是什么
    在C++中,concept的作用是定义一种通用的约束,用于限制模板参数的类型范围。通过使用concept,可以在编译时对模板参数进行...
    99+
    2024-05-15
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作