《C语言程序设计 文档》由会员分享,可在线阅读,更多相关《C语言程序设计 文档(28页珍藏版)》请在金锄头文库上搜索。
1、 是否具有对高级语言 支持已成为衡量微控制器性能的标准之一。显然,在 台上要比在汇编级上编程具有诸多优势:代码清晰易读、易维护,易形成模块化,便于重复使用从而增加代码的开发效率。又因 C 语言的可移植性最佳而成为首选。因此,支持 C 语言几乎是所有微控制器设计的一项基本要求。指令结构的设计就着重考虑了对 C 语言的支持。一种针对 作平台的译器,1 持的 C 语言算逻操作符(# )在 指令系统算逻操作符与 符大同小异,见表 C 语言支持的数据类型持 使用的基本数据类型如表 示。3 程序调用协议由于 C 编译器产生的所有标号都以下划线(_)为前缀,而 C 程序在调用汇编程序时要求汇编程序名也以下划
2、线( _ )为前缀。模块代码间的调用,是遵循 系的调用协议(所谓调用协议,是指用于标准子程序之间一个模块与另一模块的通讯约定;即使两个模块是以不同的语言编写而成,亦是如此。调用协议是指这样一套法则:它使不同的子程序代码之间形成一种握手通讯接口,并完成由一个子程序到另一个子程序的参数传递与控制,以及定义出子程序调用与子程序返回值的常规规则。调用协议包括以下一些相关要素:1) 调用子程序间的参数传递;2) 子程序返回值;3) 调用子程序过程中所用堆栈;4) 用于暂存数据的中间寄存器。系的调用协议的内容如下:1. 参数传递参数以相反的顺序(从右到左)被压入栈中。必要时所有的参数都被转换成其在函数原型
3、中被声明过的数据类型。但如果函数的调用发生在其声明之前,则传递在调用函数里的参数是不会被进行任何数据类型转换的。2. 堆栈维护及排列函数调用者应切记在程序返回时将调用程序压入栈中的参数弹出。各参数和局部变量在堆栈中的排列如图 示。3. 返回值16 位的返回值存放在寄存器 。32 位的返回值存入寄存器对 2 中;其中低字在 ,高字在 。若要返回结构则需在 存放一个指向结构的指针。4. 寄存器数据暂存方式编译器会产生 程动作来暂存或恢复 R 及 存器。汇编器则通过令可将 动压入栈中,而通过或令将其自动弹出栈来。5. 指针编译器所认可的指针是 16 位的。函数的指针实际上并非指向函数的入口地址,而是
4、一个段地址向量_该向量里由 2 个连续的 数据单元存放的值才是函数的入口地址。下面以具体实例来说明 系的调用协议。 C 程序中调用汇编函数在 C 中要调用一个汇编编写的函数,需要首先在 C 语言中声明此函数的函数原型。尽管不作声明也能通过编译并能执行代码,但是会带来很多的潜在的 面首先观察最简单的 C 调用汇编的堆栈过程:程序 4参数传递的 C 语言调用汇编函数/*/ 描述: 无参数传递的 C 语言调用汇编函数/ 日期: 2002/12/10/*/_ /声明要调用的函数的函数原型,此函数没有任何参数的传递/=/ 函数: :主函数/=);/*/_ 来自于 时程序,无入口出口参数。/ 束/*/汇编
5、函数如下:/=/函数: :_:延时程序/参数:无/返回:无/= 发环境下运行可以看到调用过程堆栈变化十分简单,如图 示。现在在 C 语言中加入局部变量来观察调用过程:程序 4 语言中具有局部变量/*/ 描述: 局部变量调用示意/ 日期: 2002/12/10/*/_ /声明要调用的函数的函数原型,此函数没有任何参数的传递/=/ 函数: :主函数/=i = 1, j = 2, k = 3;);i = 0;i+;j = 0;j+;k = 0;k+;/*/ _来自于 时子程序。无入口出口参数。/ _,);点亮 ,位数(B,显示值/ 束/*/汇编函数如下:=/函数: :_:延时子程序/参数:无/返回:
6、无/=图 表示出了, C 语言中的局部变量( i,j,k)在堆栈中存放的位置。进一步,我们为函数 递三个参数 i,j,k。同样来观察堆栈的变化,来理解调用协议。程序 4 向汇编函数传递参数/*/ 描述: C 向汇编函数传递参数/ 日期: 2002/12/11/*/_a,b,c); /声明要调用的函数的函数原型/=/ 函数: :主函数/=i = 1, j = 2, k = 3;)i,j,k);i = 0;i+;j = 0;j+;k = 0;k+;/*/_a,b,c); 来自于 试传递参数,a,b,c 所传递的参数,无出口参数。/ 束/*/汇编函数如下:/=/函数: :_a,b,c)/描述:测试传递参数/参数:a,b,c 所传递的参数/返回:无/=通过以上三个例子,我们了解到 C 调用函数时是如何进行参数传递的。另外的一个问题就是关于函数的返回值,是怎样实现的。函数的返回相对简单,在汇编子函数中,返回时寄存器 的内容,就是此函数 16 位数据宽度的返回值。当要返回一个 32 位数据宽度的返回值时,则利用的是 的内容:低 16 位内容,