51单片机是最早的单片机,也是在国内应用最广泛的单片机,为大家所喜爱!但执行速度较其它单片机较慢。因此在编程时更加要注重程序的执行效率及编程上的技巧处理,最大限度的发挥其性能,满足项目开发的实际需要。... 显示全部

51单片机是最早的单片机,也是在国内应用最广泛的单片机,为大家所喜爱!但执行速度较其它单片机较慢。因此在编程时更加要注重程序的执行效率及编程上的技巧处理,最大限度的发挥其性能,满足项目开发的实际需要。在嵌入式开发中,C语言具有可移植性强和可读性好等优点,而汇编语言的高效、快速及可直接对硬件进行操作等优点又是C语言所难以达到的,本帖就为大家介绍一下KEIL C51所支持C和汇编混合编程的方法,将这两种语言的优点完美的结合,更大限度的发挥51单片机的性能,加快我们的产品开发周期!

如用此方法实现6时钟(6T)的51单片机对320kbps mp3文件的流畅播放,就是这种混合编程的方法的一个很好的应用实例!下面就为大家介绍一下混合编程的方法。

所谓混合编程,就是在一个项目中,同时使用C和汇编两种语言。 C语言和汇编语言混合编程的方法形式多样,可以是以汇编语言为主体,在其中内嵌部分C语言;也可以是以C语言为主体在其中加入部分汇编语言(此方法实用价值较高,而被工程师们广泛的采用)。在此方法中,用汇编语言编写对有关硬件的驱动和处理、复杂的算法、实时性要求较高等底层的东西,来满足单片机对某些硬件高效、快速、精确的处理等性能上的要求。用C语言来编写程序的主体部分。这样就将C语言的可移植性强和可读性好与汇编语言的高效、快速及可直接对硬件进行操作等优点相结合。两者优劣互补、相得益彰,加快我们产品的开发周期,具有极高的现实意义和实用价值!

在KEIL C51中加入的汇编代码需按照其编译器中约定的规则才可以实现C语言程序对汇编代码的调用。即KEIL C51的命名规则和参数传递规则。

一. KEIL C51的命名规则

在KEIL C51中,编译器对C语言程序中的函数会自动的进行转换,转换规则如下表:

函数属性                             函数举例                段中的函数名

无参数或无寄存器参数传递的函数           void func1(void)          func1

含通过寄存器传递的参数                   void func2(int)              _func2

可重入函数                                void func3(char)reentrant       _?func3

二. KEIL  C51函数的参数传递规则

(一)通过寄存器传递的函数参数表

参数长度        第1个形参        第2个形参        第3个形参

1字节(char)          R7                 R5                 R3

2字节(int)          R6(H) R7         R4(H) R5         R2(H) R3

3字节(通用指针) R1(H)~R3

4字节(long)          R4(H)~R7

(二)函数返回值使用的寄存器列表

返回类        使用的寄存器

位数据(bit)                位累加器CY

1字节(char)                R7

2字节(int)                R6(H) R7

3字节(通用指针)        R3(类型)R2(H) R1

4字节(long)                R4(H)~R7

4字节(float)                R4(H)~R7,32位IEEE格式,指数和符号位在R7

在混合编程中,最常用也是最实用的方法是在C语言中加入部分汇编语言的代码,分为两种方法。

方法1)在Keil C51的函数中直接插入汇编语句

方法2)按照Keil C51接口规则,编写汇编模块

方法1是利用编译控制命令#pragma asm(用来标识所插入的汇编语句的起始位置) 和 #pragma endasm (用来标识所插入的汇编语句的结束位置) ,这两条命令必须成对出现,并可以多次出现。在Keil C51中不对插入的汇编代码做任何的处理。

方法2编写汇编模块,需对KEIL编译器的编译过程做些了解。Keil编译器的编译过程是首先将项目中的一个个源文件编译为目标代码(obj文件),然在再通过连接器产生为最终可执行的hex文件。

目标代码将其中的代码、数据、常量放在不同的“段”中,保存程序的段称为“代码段”,保存数据的段称为“数据段”,最终目标代码经过Keil的连接器按照“段”的要求转换为程序和数据地址固定的可执行文件。

在Keil软件中,“段”按定位属性分为:“可重定位段”和“绝对段”。

“可重定位段”:程序和数据在其分别所对应的存储单元(FLASH和RAM)中的存储地址是浮动的、可重定义的、相对可变的。

“绝对段”:其地址在连接前就已确定不变,连接器据此为它分配地址。

经Keil编译器生成的“段”具有如下属性:

1)段的存储属性(program code data pdata xdata bdata bit等);

2)段的起始地址;3)段的长度;

4)段的定位要求:绝对段地址固定,可重定位段定位的要求如要求代码段在2K范围内,数据段定位在可位寻址区等;

5)段名:包括程序和数据(变量和常量)的段的存储属性及段所属的程序模块(文件)。代码段: ?PR? funcname?Filename

数据段如:?DT? funcname?Filename; ?BI? funcname?Filename

标准段名前缀列表

段前缀        存储类型                    含义

?PR?        Program                   程序存储区的代码

?CO?        code                程序存储区的常量

?BI?        Bit                内部数据存储区的可位寻址的位变量

?BA?        Bdata                内部数据存储区的可位寻址的字节变量

?DT?        Data                内部数据存储区的变量

?ID?        Idata                内部数据存储区可间接寻址的变量

?PD?        Pdata                外部数据存储区的页变量

?XD?        Xdata                外部数据存储区的变量

KEIL C51在线汇编举例和汇编模块举例可供大家下载参考!

C语言为什么不能移植,C语言有可移植性强和可读性好等优点,而汇编语言的高效、快速等优点又是C语言所难以达...相关推荐

  1. 嵌入式c语言移植,嵌入式C语言位操作的移植方法

    单片机的应用越来越广泛,种类也越来越多.由于嵌入式C语言可读性强.移植性好,与汇编语言相比大大减轻了软件工程师的劳动强度,因而越来越多的单片机工程师开始使用C语言编程.但C语言的可移植性仅限于与硬件无 ...

  2. 嵌入式c语言移植,嵌入式c语言位操作的移植与优化.doc

    嵌入式C语言位操作的移植与优化 导语:?由于嵌入式C语言可读性强.移植性好,与汇编语言相比大大减轻了软件工程师的劳动强度,因而越来越多的单片机工程师开始使用C语言编程. 引言 单片机的应用越来越广泛, ...

  3. matlab代码移植C语言

    介绍一下将matlab代码移植成C语言的过程.利用matlab中自带的matlab转C/C++的工具,以一个具体的实例讲解具体的步骤,以及对过程中可能会出现的问题提供了解决方案. 目录 一.matla ...

  4. 《全面掌握Linux C语言嵌入式系统移植教程》学习笔记(Liunx速查简明)

    全面掌握Linux C语言嵌入式系统移植教程学习笔记(Liunx速查简明) 笔记前言: P3: shell命令简明 P4: vi /vim编辑器入门 P5:vi /vim编辑器扩展 P8: gcc编译 ...

  5. python基于什么语言-一种基于Python语言的EDA开发平台及其使用方法与流程

    本发明涉及EDA开发的技术领域,尤其是指一种基于Python语言的EDA开发平台及其使用方法. 背景技术: 目前,主流的EDA设计语言Verilog HDL能实现完整的芯片硬件逻辑电路开发,但是其代码 ...

  6. python语言的类型是_Python语言类型

    Python是一门动态解释型的强类型语言. 对这句话进行解析,语言分为动态的和静态的,编译型和解释型的,强类型的和弱类型的语言之分. 下面对三种不同维度的类型的语言进行解释: 1.编译型和解释型 差别 ...

  7. 【详解】Java语言的特点以及Java语言与C/C++的比较

    文章目录 一.Java语言的特点 1.跨平台性/可移植性 2.面向对象 3.简单性 4.分布性 5.健壮性 6.安全性 7.解释型 8.多线程 二.Java与C/C++的区别 1.指针 2.多重继承 ...

  8. C语言求积标识符,《C语言程序设计》模拟试卷四.doc

    <C语言程序设计>模拟试卷四 一.?????????? 单项选择题(每题2分,共30分) 1.下列对C语言特点的描述中,错误的是????? . A)C语言不是结构化程序设计语言?? B)C ...

  9. 北大青鸟c语言课后答案,北大青鸟C语言教程--第一章 C语言基础.ppt

    <北大青鸟C语言教程--第一章 C语言基础.ppt>由会员分享,可在线阅读,更多相关<北大青鸟C语言教程--第一章 C语言基础.ppt(20页珍藏版)>请在人人文库网上搜索. ...

最新文章

  1. 嵌入式开发都需要会些什么
  2. Gif(1)-加载视图-交替圆效果
  3. ssh整合问题总结--使用struts2+Ajax+jquery验证用户名是否已被注册
  4. spring boot二:搭建环境
  5. SQL:如何用一个sql统计出全校男生个数、女生个数以及总人数
  6. 作者:孟磊,山东省农业信息中心助理农经师。
  7. java基础—集合 Vcetor 基本方法演示
  8. Linux Socket C语言网络编程:Select Socket
  9. linux read函数_浅谈Linux内核IO体系之磁盘IO
  10. 微软CRM记录列表每页显示超过250个记录解决办法
  11. shell 中的expect 用法
  12. 基于Bootstrap的后台通用模板
  13. VS2017 Visual Assist X破解方法
  14. 酒店预订高保真移动端Axure原型模板
  15. libreoffice word转pdf时中文乱码问题解决
  16. 中高端洪流已至,酒店企业如何趁势突围
  17. pycharm定时运行python脚本_Python脚本定期执行_执行python脚本_如何执行python脚本
  18. python创建一个列表、用于存储同学姓名_python学习日记04,Python
  19. 王恩东:摩尔定律的终结本质上是没有革命性技术
  20. 活动报名 | 「将门ECCV 2020鲜声夺人云际会」踏浪而来!

热门文章

  1. 语音识别数据增强方法(google2019年7月论文)
  2. IDEA终于支持云端了,可同步所有配置和插件,一招搞定,重装不愁
  3. 总结自适应网站的标准尺寸
  4. 手把手教你实现红黑树
  5. GUC-10 线程八锁
  6. MATLAB/SAS学习笔记
  7. journal日志部分参数理解
  8. 独立产品灵感周刊 DecoHack #033 - 免费的博客主题推荐
  9. 如何通过网络赚钱(1年纯赚7000万有感)
  10. pip3与pyttsx3文字语音转换