网站大量收购独家精品文档,联系QQ:2885784924

第6章C51与汇编语言混合编程.ppt

  1. 1、本文档共48页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第6章C51与汇编语言混合编程

第6章 C51与汇编语言混合编程 6.1、C51与汇编语言混合编程概述 6.2、C51和A51程序接口基础 6.3、混合编程的实现 6.1 C51与汇编语言混合编程概述 在一个应用程序中,根据每个任务的具体特点和要求,用不同的编程语言编写源程序,最后通过编译/连接器生成一个可执行的完整程序,这种编程方式称为混合编程。 单片机程序的编译过程 : 6.2 C51 和A51程序接口基础 C语言与汇编语言程序的连接,在技术上有两个问题:一个是C语言程序与汇编语言程序如何相互调用;另一个是C语言程序和汇编语言程序如何实现相互之间的数据传递。 混合编程中,必须约定两个规则,即命名规则和参数传递规则。 6.2.1 C51函数名的转换及其命名规则 C51程序模块编译成目标文件后,其中的函数名要依据其定义的性质转换为相应不同的函数名。因此,在C和汇编程序的相互调用中,要求汇编程序必须服从这种函数名的转换规则,否则将无法调用到所需的函数甚至出现错误。 C51中函数名的转换规则如表6-1所示,其汇编符号名全部转换为大写。 6.2.2 C51函数及其相关段的命名规则 一个C51源程序模块被编译后,其中的每个函数以“?PR?函数名?模块名”为命名规则被分配到一个独立的CODE段。 例如,如果模块“FUNC51”内包含一个名为“func”的函数,则其CODE段的名字是“?PR?FUNC?FUNC51”。 如果一个函数包含有data或bit类型的局部变量,编译器将按“?函数名?BYTE”或“?函数名?BIT”命名规则建立一个data或bit段,它们代表所要传递参数的起始位置,其偏移量为0。这些段是公开的,因而它们的地址可以被其它模块访问。 这些段被编译器赋予“OVERLAYABLE”标志,可被L51连接/定位器作覆盖分析。依据所使用的存储器模式,这些段按表6-2所列规则命名,在相互调用时,汇编语言必须服从C51有关段名的命名规则。 6.2.3 C51函数的参数传递规则 C51中调用汇编程序时参数传递有两种方式,一种是通过寄存器传递,一种是通过固定存储区传递。 1.通过寄存器传递参数 Keil C51规定,调用函数时,通过寄存器最多可传递3个参数,余下的通过固定存储区传递。 如果在源程序中采用了编译控制命令“#pragma NOREGPARMS”,则所有参数传递都发生在固定的存储区域,所使用的地址空间依赖于所选择的存储模式。 用寄存器传递参数的函数在编译时被C51编译器在函数名前加了一个“_”的前缀,用固定存储区传递参数的函数转换成的函数名没有下划线,如表6-1所示。 不同的参数用到的寄存器不一样,不同的数据类型用到的寄存器也不同。表6-3是利用寄存器传递参数的规则。 【例6-1】函数参数传递举例。 func1(int a) a是第一个参数,在R6,R7中传递。 func2 (int b, int c, int *d ) “b”是第一个参数,在R6,R7中传递;“c”是第二个参数,在R4,R5中传递;“d”是第三个参数,在R1,R2和R3中传递。 func3(long e , long f ) “e”是第一个参数,在R4-R7中传递;“f”是第二个参数,不能在寄存器中传递,只能在固定存储区中传递。 func4(float g , char h ) “g”是第一个参数,在R4-R7中传递;“h”是第二个参数,必须在固定存储区中传递。 2.通过固定存储区传递 通过固定存储区传递参数的优点是传递途径非常清晰,缺点是代码效率不高,速度较慢。 用固定存储区传递参数给汇编程序,参数段首地址通过名为“?函数名?BYTE”的符号确定。当传递位值时,使用名为“?函数名?BIT”的符号保存位参数段首地址。所有传递的参数存放在以首地址开始递增的存储区内,即使通过寄存器传递参数,参数也将在这些段中分配空间,参数按声明的先后在每个段中顺序保存。 用作参数传递的固定存储区可能在内部数据区或外部数据区,由存储模式决定。SMALL模式的参数段用内部数据区,COMPACT和LARGE模式用外部数据区。 3.函数返回值 当函数具有返回值时,也需传递参数,这种返回值的传递是通过51内核单片机内部寄存器完成的,其传递规则如表6-4所示。 【例6-2】C51的函数名转换规则、段命名规则及参数传递规则举例。 /*-------------------------文件名:DIV.c 功能:计算x/y -------------------------*/ #include STC12C5A.h #define uchar unsigned char uchar func(uchar x,uchar y); //函数func原型声明

文档评论(0)

5500046 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档