DSP系统实验07-C语言和汇编语言的混合编程.ppt_第1页
DSP系统实验07-C语言和汇编语言的混合编程.ppt_第2页
DSP系统实验07-C语言和汇编语言的混合编程.ppt_第3页
DSP系统实验07-C语言和汇编语言的混合编程.ppt_第4页
DSP系统实验07-C语言和汇编语言的混合编程.ppt_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言和汇编语言的 混合编程 汇编语言编程 优点:可以充分地控制处理器的功能,为人工映射算法构成最有效的程序 缺点:编码效率低、可维护性和移植能力差 C/C+语言编程 优点:编码效率高、可维护性和移植性好 缺点:速度慢、存储器利用效率低 混合编程,C语言和汇编语言的混合编程,以TMS320C2x/C2xx/C5x的C编译器为例 1 C语言的存储器模型 2 C语言的寄存器规则 3 C语言的函数调用规则 4 C与汇编语言的接口,C语言和汇编语言的混合编程C语言的存储器模型,1 C语言的存储器模型 C编译器产生的段,C语言和汇编语言的混合编程C语言的存储器模型,C系统堆栈(软件堆栈) 堆栈的作用 分

2、配局部变量 向函数传递参数 保存函数的返回地址 保存处理器的状态 保存寄存器 保存暂时结果 堆栈的大小 默认大小为 1k字,链接时可用-stack size改变大小 编译器、链接器没有提供检查堆栈溢出的方法,堆栈溢出会破环运行环境,导致程序失败,因此,要确保有足够大的空间用于堆栈的扩展 堆栈的管理 堆栈从低地址向高地址增长 AR1:堆栈指针(SP),SP指针指向堆栈的下一个可访问单元 AR0:结构(frame)指针(FP),指向当前结构的开始处,函数调用时,函数的局部变量会在栈顶创建一个新的frame,C语言和汇编语言的混合编程C语言的存储器模型,动态存储空间(.system段) 用于运行时为

3、变量动态分配存储器,malloc、calloc、realloc、free 总是采用间接寻址来访问,即用指针来访问 默认大小为1k字 链接时可用-heap size改变大小,C语言和汇编语言的混合编程C语言的寄存器规则,2 C语言的寄存器规则 寄存器使用、保存规定 编译器如何使用寄存器 函数调用时如何保护寄存器值,C语言和汇编语言的混合编程C语言的寄存器规则,状态位域 保留值是在进入一个函数或从一个函数返回时,编译器期望的该位域的值 短横线表示编译器不期望一个特定的值 被修改栏表明编译器代码产生器是否曾修改该位域,C语言和汇编语言的混合编程C语言的寄存器规则,堆栈指针、结构指针和局部变量指针 堆

4、栈指针SP AR1堆栈指针SP,指向堆栈的下一个可访问单元 堆栈从低地址向高地址增长 结构(frame)指针FP 当一个函数要求局部存储时(如局部变量、暂存单元),它将在堆栈中建立自己的操作空间(局部结构),该局部结构在函数进入时在堆栈中建立分配,在函数返回时释放分配 AR0结构指针FP,指向当前结构的开始处 FP指向的局部结构的第一个单元被用作暂时存储单元,以允许寄存器之间的数据传输,且对于C函数的重入是必须的 局部变量指针LVP AR2局部变量指针LVP 所有存储在局部结构中的对象,包括参数,都通过LVP进行间接访问,C语言和汇编语言的混合编程C语言的寄存器规则,寄存器变量 寄存器变量是局

5、部变量,位于寄存器中(不是存储器中)的编译器的临时变量 编译器使用这些寄存器变量的方式取决于是否使用了优化器 表达式分析寄存器 表达式分析寄存器用于计算表达式的值并保存临时的结果 表达式分析寄存器的内容在被调函数中不被保护 任何用于临时存储的表达式分析寄存器在函数调用前被保存在局部结构中 返回值 函数返回值放在累加器中,C语言和汇编语言的混合编程C语言的函数调用规则,3 C语言的函数调用规则 如何产生函数调用 一个函数(父函数)在调用其它函数(子函数)执行以下任务 注意:ARP必须设为1 1)父函数将参数以颠倒的顺序压入堆栈,最右边声明的参数第一个压入堆栈,最左边的参数最后一个压入堆栈,即最左

6、边的参数在栈顶 2)父函数调用子函数 3)父函数假定从子函数返回时,ARP将被置为1 4)完成调用后,父函数以SBRK n (n是压入堆栈的参数个数)将参数弹出堆栈,C语言和汇编语言的混合编程C语言的函数调用规则,被调函数如何相应响应 被调函数(子函数)需要完成以下任务 在函数的入口,ARP假定已经设置为1 1)将返回地址从硬件堆栈中弹出,并压入软件堆栈中 2)将原FP压入软件堆栈 3)分配局部结构 4)如果子函数中修改了AR6和/或AR7,则将它们压入堆栈,其它的任何寄存器可能被无保存地修改 5)执行该函数的代码 6)将返回值放入累加器 7)设置ARP为AR1 8)如果AR6和/或AR7被保

7、存,则恢复它们 9)释放局部结构分配 10)恢复原FP 11)从软件堆栈中复制返回地址,并压入硬件堆栈 12)返回父函数,C语言和汇编语言的混合编程C语言的函数调用规则,例,C语言和汇编语言的混合编程C语言的函数调用规则,被调函数的特殊情况 没有将返回地址移到软件堆栈中 如果被调函数(子函数)没有调用其它函数,或只调用了一个运行支持函数,且编译器知道该函数不会超过8级深度的调用,即不会发生硬件堆栈的溢出,则就不必将返回地址从硬件堆栈中弹出,又压入软件堆栈中 没有分配局部结构 如果没有局部变量,也没有使用由AR0(FP)指向的暂时存储单元,则不必分配局部结构 参数和局部变量的访问 参数和局部变量

8、通过LVP(AR2)来访问 参数总是相对于FP的负偏移量 局部变量总是相对于FP的正偏移量,C语言和汇编语言的混合编程C语言与汇编语言的接口,4 C语言与汇编语言的接口 独立的C和汇编模块接口 在编写汇编语言时必须遵循有关的寄存器规则和调用规则,否则可能会破坏C的运行环境 在编写独立的汇编程序时,必须注意以下几点: 无论是C函数还是汇编函数,都必须遵循寄存器使用规则 必须保护函数要用到的几个专用寄存器,专用寄存器包括:AR0(FP)、AR1(SP)、AR6和AR7;其中,如果SP正常使用的话,则不必明确加以保护,即只要汇编函数在返回时弹出压入的对象,实际上就已经保护了SP 其它寄存器可以自由使

9、用,C语言和汇编语言的混合编程C语言与汇编语言的接口,如果改变了状态位域的假定值,则函数返回时必须被恢复,尤其是ARP,必须为1 中断程序必须保护所有用到的寄存器 汇编语言调用C函数时,将参数以逆序压入软件堆栈,函数调用后弹出堆栈 调用C函数时,C函数只保护几个专用寄存器,C函数可能改变其它任何寄存器的内容 长整型和浮点数在存储器中存放的顺序是低位字在低地址,高位字在高地址 如果函数有返回值,则返回值存放在累加器ACC中 汇编程序不能改变由C产生的.cinit段的内容,否则可能会引起不可预测的后果 编译器在所有的C标识符(函数名、变量名等)前加下划线“_”;因此,在编写汇编程序时,必须在C程序

10、要访问的对象前加下划线“_”;例如,在C程序中定义了变量x,在汇编语言中使用时为_x;如果仅在汇编语言中使用的标识符,则不必加下划线 任何在汇编程序中定义的对象或函数,如果需要在C程序中访问或调用,则必须用.global汇编伪指令声明;同样,在C程序中定义的对象或函数,如果需要在汇编程序中访问或调用,在汇编程序中也必须用.global汇编伪指令声明,C语言和汇编语言的混合编程C语言与汇编语言的接口,例:C程序main函数调用一个汇编函数asmfunc,asmfunc函数只有一个参数,该参数与C中的全局变量gvar相加,返回该结果 例中可以不必将返回地址从硬件堆栈移到软件堆栈中,因为asmfun

11、c函数没有进行别的调用,C语言和汇编语言的混合编程C语言与汇编语言的接口,在C程序中直接嵌入汇编语句 在C程序中使用asm语句嵌入单行的汇编语句 优点:简单,在C程序中可以实现C语言无法实现的一些硬件控制功能,如修改中断控制寄存器、中断的是能或无效、读取状态寄存器和中断标志寄存器等 缺点:容易破坏C环境,因为C编译器不对嵌入的汇编语句进行检测和分析 注意 在C代码中嵌入跳转语句或标识符可能会产生无法预知的结果 不要改变C变量的值,但可以安全地读任何变量的当前值 不要嵌入汇编伪指令,这会破坏汇编语言环境,C语言和汇编语言的混合编程C语言与汇编语言的接口,在C代码中访问汇编语言变量 在汇编语言中定义变量,变量名前加下划线“_” 使用.global声明为全局变量 在C程序中声明该变量为外部的,并正常地对它访问,C语言和汇编语言的混合编程C语言与汇编语言的接口,2,C语言和汇编语言的混合编程C语言与汇编语言的接口,在汇编语言中访问C程序

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论