当前位置: 首页 > 科技观察

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

时间:2023-03-20 19:46:29 科技观察

现在可能很少见到汇编程序了,但是在单片机的启动文件、RTOS的底层代码等一些地方还是有汇编代码的。不知道大家有没有学过汇编,或者用过汇编语言编译过?今天给大家分享一下汇编语言的那些事。1学习汇编语言10年在学单片机编程的时候,老师还是教我们汇编,包括教实验,让我们用汇编写程序。MOVA,#00HMOVP1,A记得当时,老师让我们背汇编指令。虽然很多汇编指令现在写不出来,但是看了很多汇编代码,还是基本明白了它的意思。过去,计算机三级(PC技术)的计算机考试采用的是汇编编程。那时候,我的机考还是满分。那时候觉得自己牛逼,现在看来自己就是个菜鸟。图2汇编转C语言刚开始学汇编的时候,真的是用汇编在51单片机上写流水灯程序。看了C语言的流水灯程序,突然发现,哇,用C语言写程序原来可以这么简单方便。所以,那个时候,我放弃了汇编,转向了C语言。包括自己在大学实验室的学习,自己动手做东西,还有后来的全国大学生电子设计大赛,所有的程序都是用C语言写的。一个10行的汇编程序可能只需要一行C语言代码就可以实现,这就是C语言相对于汇编的简化的优势。但是,用C语言编写的程序,编译后也会转为汇编。比如我们在线调试代码的时候,会看到类似的“汇编窗口”:因为以往的单片机运行速度不高,内存和Flash容量都不大,所以需要以节省程序空间。所以使用汇编的好处:代码运行效率更高,节省代码存储空间。3汇编语言和C语言写水灯程序比较汇编语言编程的主要缺点:语法复杂,可读性差,代码量大等举个例子:51单片机上的流水灯程序.分别是用C语言和汇编写的,对比一下就知道了。C语言版:/*********************宏定义***************************/#defineMAIN_Fosc22118400L//定义主时钟/*********************延迟函数*****************************/voiddelay_ms(u8ms){u16i;do{i=MAIN_Fosc/13000;while(--i);//14Tperloop}while(--ms);}/*********************主要功能***************************/voidmain(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_KHZEQU22118;22118KHZSTACK_POIRTEREQU0D0H;StackStartGeology;******************延迟函数*************************/F_delay_ms:PUSH02H;推R2PUSH03H;推R3PUSH04H;推R4MOVR2,AL_delay_ms_1:MOVR3,#HIGH(Fosc_KHZ/13)MOVR4,#LOW(Fosc_KHZ/13)L_delay_ms_2:MOVA,R4;1TTotal13T/loopDECR4;2TJNZL_delay_ms_3;4TDECR3L_delay_ms_3:DECA;1TORLA,R3;1TJNZL_delay_ms_2;4TDJNZR2,L_delay_ms_1POP04H;出栈R2POP03H;出栈R3POP02H;出栈R4RET;**********************主程序*************************/ORG0100H;resetF_Main:CLRAMOVP0M1,A;设置为准双向口MOVP0M0,AMOVP1M1,A;设置为准双向端口MOVP1M0、AMOVP2M1、A;设置为准双向端口MOVP2M0、AMOVP3M1、A;设置为准双向端口MOVP3M0、AMOVP4M1、A;设置为准双向端口MOVP4M0、AMOVP5M1、A;设置为准双向端口MOVP5M0,AMOVP6M1,A;设置为准双向端口MOVP6M0,AMOVP7M1,A;设置为准双向端口MOVP7M0,AMOVSP,#STACK_POIRTERMOVPSW,#0;选择组0R0~R7L_MainLoop:CLRP1.7MOVA,#250LCALLF_delay_ms;延时250msLCALLF_delay_ms;延时250msSETBP1。7CLRP1.6MOVA,#250LCALLF_delay_ms;延时250msLCALLF_delay_ms;延时250msSETBP1.6CLRP4.7MOVA,#250LCALLF_delay_ms;延时250msLCALLF_delay_ms;延时250msSETBP4.7CLRP4.6MOVA,#250LCALLF_delay_ms;延时250msLCALLF_delay_ms;延时250msSETBP4.6SJMPL_MainLoop上面两个程序,实现的功能是一样的(流水灯),但是和代码相比,你发现有什么不同?对于有装配基础的同学来说,这个简单的流水灯程序可能比较容易理解。然而,对于大多数人来说,你肯定会发现汇编很难阅读。是的,这是编译的一个“特性”。4最后,汇编语法。对于大多数读者来说,我现在不建议进一步学习,只需要了解一些基本内容即可。有小部分人想从事底层开发,比如底层驱动、单片机验证、固件库开发等,有时间的读者还是可以多了解一些汇编技术。