DSP系统实验07-C语言和汇编语言混合编程.pptVIP

DSP系统实验07-C语言和汇编语言混合编程.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语言和汇编语言的混合编程 以TMS320C2x/C2xx/C5x的C编译器为例 1 C语言的存储器模型 2 C语言的寄存器规则 3 C语言的函数调用规则 4 C与汇编语言的接口 C语言和汇编语言的混合编程?C语言的存储器模型 1 C语言的存储器模型 C编译器产生的段 C语言和汇编语言的混合编程?C语言的存储器模型 C系统堆栈(软件堆栈) 堆栈的作用 分配局部变量 向函数传递参数 保存函数的返回地址 保存处理器的状态 保存寄存器 保存暂时结果 堆栈的大小 默认大小为 1k字,链接时可用-stack size改变大小 编译器、链接器没有提供检查堆栈溢出的方法,堆栈溢出会破环运行环境,导致程序失败,因此,要确保有足够大的空间用于堆栈的扩展 堆栈的管理 堆栈从低地址向高地址增长 AR1:堆栈指针(SP),SP指针指向堆栈的下一个可访问单元 AR0:结构(frame)指针(FP),指向当前结构的开始处,函数调用时,函数的局部变量会在栈顶创建一个新的frame C语言和汇编语言的混合编程?C语言的存储器模型 动态存储空间(.system段) 用于运行时为变量动态分配存储器,malloc、calloc、realloc、free 总是采用间接寻址来访问,即用指针来访问 默认大小为1k字 链接时可用-heap size改变大小 C语言和汇编语言的混合编程?C语言的寄存器规则 2 C语言的寄存器规则 寄存器使用、保存规定 编译器如何使用寄存器 函数调用时如何保护寄存器值 C语言和汇编语言的混合编程?C语言的寄存器规则 状态位域 保留值是在进入一个函数或从一个函数返回时,编译器期望的该位域的值 短横线表示编译器不期望一个特定的值 被修改栏表明编译器代码产生器是否曾修改该位域 C语言和汇编语言的混合编程?C语言的寄存器规则 堆栈指针、结构指针和局部变量指针 堆栈指针SP AR1——堆栈指针SP,指向堆栈的下一个可访问单元 堆栈从低地址向高地址增长 结构(frame)指针FP 当一个函数要求局部存储时(如局部变量、暂存单元),它将在堆栈中建立自己的操作空间(局部结构),该局部结构在函数进入时在堆栈中建立分配,在函数返回时释放分配 AR0——结构指针FP,指向当前结构的开始处 FP指向的局部结构的第一个单元被用作暂时存储单元,以允许寄存器之间的数据传输,且对于C函数的重入是必须的 局部变量指针LVP AR2——局部变量指针LVP 所有存储在局部结构中的对象,包括参数,都通过LVP进行间接访问 C语言和汇编语言的混合编程?C语言的寄存器规则 寄存器变量 寄存器变量是局部变量,位于寄存器中(不是存储器中)的编译器的临时变量 编译器使用这些寄存器变量的方式取决于是否使用了优化器 表达式分析寄存器 表达式分析寄存器用于计算表达式的值并保存临时的结果 表达式分析寄存器的内容在被调函数中不被保护 任何用于临时存储的表达式分析寄存器在函数调用前被保存在局部结构中 返回值 函数返回值放在累加器中 C语言和汇编语言的混合编程?C语言的函数调用规则 3 C语言的函数调用规则 如何产生函数调用 一个函数(父函数)在调用其它函数(子函数)执行以下任务 注意:ARP必须设为1 1)父函数将参数以颠倒的顺序压入堆栈,最右边声明的参数第一个压入堆栈,最左边的参数最后一个压入堆栈,即最左边的参数在栈顶 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被保存,则恢复它们 9)释放局部结构分配 10)恢复原FP 11)从软件堆栈中复制返回地址,并压入硬件堆栈 12)返回父函数 C语言和汇编语言的混合编程?C语言的函数调用规则 例 C语言和汇编语言的混合编程?C语言的函数调用规则 被调函数的特殊情况 没有将返回地址移到软件堆栈中 如果被调函数(子函数)没有调用其它函数,或只调用了一个运行支持函数,且编译器知道该函数不会超过8级深度的调用,即不会发生硬件堆栈的溢出,则就不必将返回地址从硬件堆栈中弹出,又压入软件堆栈中 没有分配局部结构 如果没有局部变量,也没有使用由AR0(FP)指向的暂时存储单元,则不必分配局部结构 参数

文档评论(0)

bhyq + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档