文档详情

第5章 单片机C语言与汇编语言混合编程.ppt

发布:2017-06-01约3千字共11页下载文档
文本预览下载声明
* 第5章 单片机C语言与汇编语言混合编程 第5章 单片机C语言与汇编语言混合编程 5.1 混合编程概述 5.1.1 单片机汇编语言的特点 1.执行速度、效率高和实时性强 2.编写的程序代码短,对硬件操作方便 3.保持了机器语言的优点,具有直接和简洁的特点 4.可维护性和可读性差 5.可移植性差 5.1.2 单片机C语言的特点 1.可读性、可移植性好和使用范围广 2.语言简洁、紧凑、使用方便、灵活 3.运算符丰富 4.数据结构丰富,具有现代化语言的各种数据类型 5.可进行结构化的程序设计 6.可以直接对计算机硬件进行操作 7.生成的目标代码质量高,程序执行效率高 5.1.3 单片机混合编程的优点 1.编程效率高 2.执行速度快 3.可读性、可移植性好和使用范围广 5.1.4 单片机混合编程的基本方式 1.汇编中调用C51程序 单片机C语言和汇编语言混合编程分为汇编中调用C51函数和C51程序中引用汇编,通常使用的是在C51程序中引用汇编。在C51程序中使用汇编语言有两种情况: C51程序调用汇编程序模块的变量和函数和嵌入式汇编 C语言是结构化程序设计语言,C语言程序以函数为单位,在汇编程序中可以访问C51程序中的变量和函数。 (1)对于变量: 普通变量:_变量名 数组:_数组名+偏移量 如用_XX可以访问C语言程序中定义的变量XX;用_XX+3可以访问数组中的XX[3]。 (2)对于函数: 函数没有参数:函数名 函数有参数:_函数名 ,并且调用函数前还要准备好参数。 如在C51程序中定义了没有参数的函数fun1(),则在汇编程序中用子程序调用指令调用fun1即可;如定义了有参数的函数fun2(),则在汇编程序中调用时,子程序名用成_fun2。 注意: 为了能够让汇编语言访问到C语言中定义的变量和函数,在C程序中它们必须声明为外部变量,即加extern 前缀 2.在C51中嵌入汇编程序 嵌入汇编程序是通过C51中的预处理指令#pragma asm/endasm 语句来实现的。其格式如下: #pragma ASM ;汇编程序代码 #pragma ENDASM 3. 在C51中调用汇编程序 这种方法应用较多,C模块与汇编模块的接口较简单,分别用C51与A51对源程序进行编译,然后用L51将obj文件连接即可,关键问题在于C函数与汇编函数之间的参数传递和得到正确的返回值,以保证模块间的数据交换。 5.2 混合汇编的参数传递与实现 5.2.1 混合汇编的参数传递 1.汇编程序调用C51函数的参数传递 如C51函数有参数,则汇编程序在调用C51函数前要准备好参数。在汇编程序中C51函数最左边的一个参数由寄存器A传递,其他的参数按顺序通过堆栈给出。C51函数的返回值是返回到A寄存器或者由A寄存器给出的地址。 2.在C51中嵌入汇编程序的参数传递 通过变量或特殊功能寄存器来实现 3.在C51中调用汇编程序的参数传递 C51中调用汇编程序进行参数传递时都必须严格遵守C51函数的参数和返回值的相关约定。 C51中调用汇编程序进行参数传递的方式有两种,一种是通过寄存器传递参数,第二种是通过固定存储区传递。 1) 通过寄存器传递参数 最多可通过51单片机的工作寄存器传递3个参数,余下的通过固定存储区传递, R1、R2、R3 无 R2、R3 R3 第3个 R1、R2、R3 R4~R7 R4、R5 R5 第2个 R1、R2、R3 R4~R7 R6、R7 R7 第1个 通用指针 long/float int char 参数类型 第一个参数b在寄存器R6和R7中传递,第二个参数c在寄存器R4和R5中传递,第三个参数d在寄存器R1、R2和R3中传递 func2(int b,int c,int *d) 唯一一个参数a在寄存器R6和R7中传递 func1(int a) 2)通过固定存储区传递 用固定存储区传递参数给汇编程序,参数段首地址用段名?function_name?BYTE和?function_name?BIT保存,function_name为函数的名称,其中,?function_name?BIT保存位参数段首地址,?function_name?BYTE保存别的参数段首地址,即使通过寄存器传递参数,参数也将在这些段中分配空间,并按声明的先后在每个段中顺序保存。 3)函数返回值 函数返回值通常用寄存器传递 存储类型在R3,高位在R2,低位在R1 R1、R2、R3 通用指针 32位IEEE格式 R4~R7 float 高位在R4,低位在R7 R4~R7 (unsigned) long 高位在R6,低位在R7 R6、R7 (unsigned)int
显示全部
相似文档