计算机基础课件 第11章C与汇编混合编程

上传人:woxinch****an2018 文档编号:56902526 上传时间:2018-10-17 格式:PPT 页数:13 大小:344.50KB
返回 下载 相关 举报
计算机基础课件  第11章C与汇编混合编程_第1页
第1页 / 共13页
计算机基础课件  第11章C与汇编混合编程_第2页
第2页 / 共13页
计算机基础课件  第11章C与汇编混合编程_第3页
第3页 / 共13页
计算机基础课件  第11章C与汇编混合编程_第4页
第4页 / 共13页
计算机基础课件  第11章C与汇编混合编程_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《计算机基础课件 第11章C与汇编混合编程》由会员分享,可在线阅读,更多相关《计算机基础课件 第11章C与汇编混合编程(13页珍藏版)》请在金锄头文库上搜索。

1、第 11章 第11章C与汇编混合编程,C51高级语言和汇编语言混合编写是目前编程者选用最多的方案。此方案的特点是兼有高级语言和汇编语言编程的优点。主程序即大框架用C51语言编写,C51语言不好处理的部分或已有现成汇编语言子程序的部分则用汇编语言编写。将复杂的数学运算、多任务管理等交给高级语言完成,而系统底层的硬件操作则由汇编语言完成。编程实践已证明,用C51高级语言编程比用纯汇编语言编程效率高,用C51高级语言和汇编语言混合编程又比用纯高级语言编程效率高。 混合编程包含两方面内容:C51高级语言调用汇编语言子程序以及汇编语言调用C51语言子程序。在工程上,前者应用比后者多得多。我们将主要介绍c

2、51高级语调用汇编语言子程序的方法。,11.1 KeUC51和A51接口所涉及的几个主要问题 (1)C51函数名的转换及其命名规则C51程序模块编译成目标文件后,其中的函数名依据其定义的性质不同会转换为不同的函数名,因此,在C和汇编程序的相互调用中,要求汇编程序必须服从这种函数名的转换规则,否则,将无法调用到所需的函数或出现错误。C51中函数名的转换规则如表111所列。,(2) C51函数及其相关段的命名规则 一个C51源程序模块被编译后,其中的每一个函数以“? PR? 函数名? 模块名”为名的命名规则被分配到一个独立的CODE段。例如,如果模块“FUNC51”内包含一个名为“func”的函数

3、,则其CODE段的名字是“? PR? FUNC? FUNC51”。如果一个函数包含DATA和BIT 对象的局部变量,则编译器将按“? 函数名? BYTE“和“? 函数名? BIT”。命名规则建立一个DATA和BIT段,它们代表所要传递参数的起始位置,其偏移值为零。这些段是公开的,因而它们的地址可被其它模块访问。另外,这些段被编译器赋予“OVERLAYABLE”标志,故可被L51链接定位器作覆盖分析。依赖于所使用的存储器模式,这些段的段名按表112所列规则命名,在相互调用时,汇编语言必须服从C51有关段名的命名规则。,C51函数的参数传递规则C和汇编接口的关键在于要弄清C函数的参数传递规则。Ke

4、il C51具有特定的参数传递规则,这就为二者的接口提供了条件。Keil C51函数最多可通过CPU寄存器传递三个参数,这种传递技术的优点是可产生与汇编语言相比拟的高效代码。表1l-3是利用寄存器传递参数的规则。如果参数较多而使得寄存器不够用时,部分参数将在固定的存储区域内传送。这种混合的情况有时会令程序员在弄清每一个参数的传递方式时遇到困难。如果在源程序中选择了编译控制命令“#pragma NOREGPARMS”,则所有参数传递都发生在固定的存储区域,所使用的地址空间依赖于所选择的存储器模式。这种参数传递技术的优点是,传递途径非常清晰;缺点是代码效率不高,速度较慢。当函数具有返回值时,也须传

5、递参数,这种返回值参数的传递均是通过CPU内部寄存器完成的,下面是几个说明参数传递规则的例子; funcl(int a):a在R6R7中传递,高8位在R6中,低8位在R7中。 func2(iht b,iht c,iht * d ):b和c分别在R6R7和R4R5中传递,d在R1R2R3中传递。 func3(1ong e,long f):e在R4R5R6R7中传递,最高8位在R4中,最低8位在R7中,f不能在寄存器中传递,须通过局部数据段传递。 func4(float g,char h,bit i): g在R4R5R6R7中传递,指数和符号位在R7中,尾数最高位在R6中,最低位在R4中。h和i不

6、能在寄存器中传递。h在局部数据段,i在局部位段中传递。不能被寄存器传递的参数只能通过局部数据段或局部位段传递。用这些局部段的别名可确定其起始地址,所有非寄存器传递的参数,可根据其数据类型分别置于以这些起始地址开始的存储器中。,11.2 在C51中调用汇编程序应用举例这里给出一个在SMALl。编译模式下C51调用汇编语言函数的例子。C51在程序文件“C_FUNC.C”中定义了一个被调用的外部汇编语言函数:extern int aftunc (int v_a,char v_b,long v_c,bit v_d);汇编语言函数接受从C51程序传递过来的参数v_a, v_b, v_c, v_d,并依次

7、放人它自己的局部变量a,b,c和d中。函数调用时须传递4个参数,按照表l-3的规定,只有参数v_a在寄存器R6和R7中传递(高位在R6,低位在R7),参数v_b在寄存器R5中传递,而参数v_c和v_d则在参数传递段中传递。在SMALL编译模式下,参数传递段位于AT89S52单片机内部数据存储器DATA区,因此汇编语言函数应按C51编译器关于SMALL模式下段名的规定在DATA区建立相应的局部数据段。由于被调用函数afunc()具有Int类型,按照表1-4的规定,函数的返回值将在工作寄存器R6(高位),R7(低位)中。,高级语言程序C_FUNC.C文件如下: #program cod small

8、 #include /*说明被调用的汇编语言程序*/ extern int aftunc(int v_a,char v_b,long v_c,bit v_d); void main (viod)/*主函数*/ /*说明函数调用的参数*/ int v_a;char v_b;long v_c;bit v_d;int a_red; /*带参数调用*/ a_red = aftunc(int v_a,char v_b,long v_c,bit v_d); 对以上模块文件C_FUNC.C 用C51编译器进行编译,再对所生成的目标文件用链接定位器L51进行链接,即可生成一个完整的应用程序。上述编程原理可推广

9、到多模块设计,需要时可调用多个汇编语言函数。 该例只说明了设计SMALL存储模式下汇编模块接口的方法。对于其它存储模式下汇编模块接口,其差异表现在局部数据段的段类型不同。,在COMPACK模式下,局部数据段的段类型为XADTA,简写为XD;而在SMALL模式下,局部数据段的段类型为DATA简写为DT。 汇编语言函数AFUNC.A51 NAME AFUNC ;定义模块名?PR?_afunc? AFUNC SEGMENT CODE ;定义程序代码段?DT?_afunc? AFUNC SEGMENT DATA OVERLAYABLE ;定义可覆盖局部数据段?BI?_afunc? AFUNC SEGM

10、ENT BIT OVERLAYABLE ;定义可覆盖局部位段?DT? AFUNC SEGMENT DATA ;定义全局数据段段名 ;定义公共符号 PUBLIC ?_afunc?BIT PUBLIC ?_afunc?BYTE ;局部数据段段名PUBLIC _afunc ;函数名RSEG afunc ?_afunc?BYTE ;起始地址v_a:DS 2 ;定义参数传递字节v_b:DS 1 v_c:DS 4a:ds 2 ;定义其它局部变量 b:ds 1c:ds 4,retval:ds 2RSEG ?BI?_afunc?AFUNC ;可覆盖局部数据段_afunc?BIT: ;起始地址v_d:DBIT

11、1 ;定义参数传递位d:DBIT 1 ;定义其它局部位变量RSEG ?PR?_afunc?AFUNC ;程序代码段 _afunc: ;起始地址MOV a,R6 ;a=v_aMOV a+01H,R7 ;b=v_bMOV a,R6 ;a=v_aMOV R6,reteval ;返回值高位MOV R7,reteval+1 ;返回值低位RETEND,11.3 在C51中调用汇编程序的一般过程C51高级语言调用汇编语言子程序的设计步骤为: 选定单片机应用系统,画好电路原理图。依照电路原理图,设计硬件电路,制做实验板。 编写汇编语言程序,并通过仿真等调试手段将其通过。 将其变成可由C51高级语言调用的子程序

12、形式。方法是汇编语言程序必须以C51的方法建立参数传递段和全局变量段,并向其它模块公布局部数据段和局部位段的别名和全局变量名。按C51参数传递规则从CPU寄存器中或参数传递段中获取参数,并按C51返回值存储规则将子程序的返回值放在CPU的寄存器中。为了不使通过寄存器传递的参数长期占用寄存器,汇编子程序宜在其入口处将寄存器中的参数转储到局部数据段和局部位段中,以便高效的寄存器资源可移作它用。 编写准备调用汇编语言子程序的C51高级语言程序,并将其变成可调用汇编语言子程序的形式。方法:在C51语言程序中,必须将被调汇编子程序声明为外部(extern)函数,将所引用的由汇编语言程序定义的全局变量声明

13、为外部变量。 建立项目工程文件,将上述可调用的各汇编语言子程序以及调用汇编语言程序的C51高级语言程序都引入其中。进行编译、汇编和链接,即可生成可编程的可执行文件“*HEX或“*BIN“,如在编译、汇编和链接中无错误,即可用编程器固化。最后把固化好的芯片置入单片机应用系统,试运行。,11.4 高级语言调用汇编语言子程序的应用(TLC594)用C51高级语言调用汇编语言子程序的方法,编写一个单路8位串行AD转换器TLC549接口。11.4.1 TLC549-5单片机的硬件连接,德州仪器公司(T1)推出的TLC549是广泛应用的CMOS 8位AD转换器。该芯片有一个模拟输入端口、3态的数据串行输出

14、接口,可以方便地和微处理器或外围设备连接。TLC549仅仅使用输入输出时钟(IO CLOCK)和芯片选择()信号控制数据。最高的输人输出时钟频率为1.1 MHz。TLC549的引脚排列及连接如图1l-l所示。图中ANALOG IN为模拟输入端;CS为片选端;DATA OUT为串行数据输出端;IOCLOCK为串行时钟输入端;REF+为正基准电压端; REF一为负基准电压端;Vcc为正电源电压端;GND为电源地。 TLC549与单片机的连接如图11-1所示,TLC549的IO CLOCK、DATA OUT和CS依次和单片机的P1O、P11和P12连接,REF+和十5V 连接,REF一和GND连接,ANALOG IN接05V模拟输入信号。,11.5 A/D转换器TLC0832混合编程应用TLC083X系列8位串行控制模数转换器,是美国德州仪器公司推出的性价比很高的AD转换器件。在8.5节已经介绍过,其特点和引脚请参考第八章的8.5节。 TLC0832与单片机的连接如图11.2,DO、CLK和CS依次和单片机的P14,P1 .5P1. 6连接,其中DO和D1连在一起。CH0和CH1接两路模拟输入信号。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 高中教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号