本文主要是关于汇编和C语言的相关介绍,并着重对汇编和C语言的不同及其编程技巧进行了详尽的阐述。
汇编和C语言
C语言和汇编语言的区别在于他们之间优缺点几乎是相反的。
C语言和汇编语言的优缺点:以c来举例
优点:
c的运行效率高;
c可以实现硬件的直接访问;
c代码的移植性好;
缺点:
c的代码复用性差;
c的代码维护性差;
c的扩展性差,即如果想增加新功能,需要修改较多的代码;
c语言的可读性差;
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言;尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
汇编语言:是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。
汇编和C语言相结合的51单片机编程技巧
c语言和汇编语言之间主要存在:相互调用、混合编程等关系,举例来说吧:
1、C语言调用汇编子程序
此时,汇编子程序需要申明为外部程序
#include《reg51.h》
extern void delay(void)
sbit pluse=P1^0;
main()
{
while(1)
{
pluse=0;
delay();
pluse=1;
delay();
}
}
汇编子程序:
汇编部分需要做如此处理。
PUBLIC DELAY
DELAY SEGMENT CODE
RSEG DELAY
DELAY:
MOV R2,#250
DJNZ R2,$
RET
END
2:C语言中嵌入汇编,这个比较简单用宏指令包含进来就可以实现。
void delay(void)
{
#pragma asm
mov r2,#250
djnz r2,$
#pragma endasm
}
浅谈如何用汇编编写模块化程序
一、主程序的书写
如上图就是结构化编程的截图,里面的.asm即是汇编文件的扩展名,C语言用的是.c 。在汇编语言中,头文件的扩展名是.inc,而在C语言中头文件的扩展名是.h。
仔细观察上图,汇编包含头文件的格式是$include(头文件完整名称),而在C语言中是#include“头文件完整名称”,二者有着非常相似之处。ORG 0000H ; LJMP MAIN应该不用我解释是有什么作用的吧?ORG指令就是指定其下面一条指令或数据的首字节按ORG后面的地址或标号存放到相应的存储单元。_MAIN_ASM SEGMENT CODE; RSEG _MAIN_ASM的作用上图已经标明了,也不用多讲,需要说明的是,_MAIN_ASM不一定要写成这样,你喜欢写什么符号都可以(如:MAINFUNC、_MAIN_FUNC、ZHUHANSHU,最后一个举例有点俗了),只要符合汇编语言变量或标号的命名规则即可。如果讲求规范,最好就按以上格式书写。还有一点就是,这段动态分配程序地址的代码可以省略,如果没有这段代码,编译器就不会动态分配程序地址了。主函数的功能大家肯定都能分析了,不然看这个教程也没什么意义了。
二、子程序的书写
下面讲的是子程序如何书写,子程序是要被调用的,你必须告诉编译器其他模块可以调用子程序模块中的哪些程序,如上所示,DELAY1MS即是可被调用的延时函数,公共变量及函数声明用关键字PUBLIC,后面跟函数名(标号名)。动态分配程序地址可以省略,在main.asm中已经讲到了。注意,子程序模块最后一行要写一个END,没有这一句,编译器不会报错,但会出现警告,容易出现问题,为了规范编程,大家还是别偷懒了。
最后一点就是头文件的作用了,这跟C语言的作用一样,可以对变量或函数进行声明,这个程序比较简单,可以直接放到主程序中声明,如下图:
结语
关于汇编和C语言的相关介绍就到这了,如有不足之处欢迎指正。