DSP 第八章 C语言编程基础.ppt

  1. 1、本文档共53页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第8章 C语言编程基础 否 表达式分析 T 否 表达式分析 P 否 表达式分析/返回值 Accumulator 是 寄存器变量 AR6~AR7 否 表达式分析 AR2~AR5 否 局部变量指针 AR2 是 堆栈指针 AR1 是 帧指针 AR0 调用是否保存 使用 寄存器 上表列出了编译器如何使用寄存器,并说明了在函数调用时寄存器在保存值时所起的具体作用。 是 - 测试控制位 TC 是 - 符号扩展模式 SXM 否 0 乘积移位模式 PM 是 - 溢出模式 OVM 是 - 溢出位 OV 是 - 数据页指针 DP 是 - 进位位 C 是 1 辅助寄存器指针 ARP 修改 预设值 名称 域 上表列出了编译器所使用的所有状态位。预设值是编译器在函数进入和返回时的期望值,修改栏是编译器产生的代码是否修改该域。 2、堆栈指针、帧指针和局部变量指针 编译器创建和使用自己的软件堆栈以用于保存函数返回地址、分配局部变量和给函数传递参数。当函数需要存储局部变量时,可以在堆栈中创建自己的工作空间(局部帧)。局部帧在函数入口时分配,在函数返回时释放。 系统提供堆栈指针(SP)、帧指针(FP)和局部变量指针(LVP)3个寄存器来管理堆栈和局部帧。 寄存器AR1用做堆栈指针。堆栈从低地址向高地址增长,SP指向堆栈中下一个可用的字。寄存器AR0用做帧指针。FP指向当前函数局部帧的起始地址。PF直接指向局部帧的第一个字,该字用做临时存储单元,可以用于实现寄存器到寄存器值的传递,同时在创建可重入C函数时也必须使用该存储单元。寄存器AR2用做局部变量指针,所有存储在局部帧的对象包括参数都要通过LVP间接引用。 3、寄存器变量 寄存器变量是指存储于寄存器而不是RAM的局部变量或编译器临时变量。 (1)不使用优化器 不使用优化器时,编译器至多为使用register关键字的两个变量分配寄存器。变量必须在参数列表中或函数的第一块中定义。编译器采用AR6和AR7作寄存器变量寄存器。 AR6保存第一个变量, AR7保存第二个变量。 (2)使用优化器 使用优化器时,所有寄存器变量定义将被忽略,由优化器决定寄存器分配。优化器直接将变量而不是地址分配给寄存器。优化器可以将AR5、AR6和AR7用作寄存器变量。AR5在函数调用时不保存,所以它在使用时可以跨越多个函数使用。 4、表达式寄存器 编译器使用没有用做寄存器变量的寄存器来计算表达式值和存储临时结果。在函数调用时不保留表达式寄存器内容。在函数调用时,用做临时存储的寄存器保存到局部帧,被调函数不用保存和恢复表达式寄存器。 5、返回值 如果函数返回值为标量类型(integer、pointer或float),则返回值保存在累加器中。当返回值为16位类型变量时,返回值在累加器中符号扩展。 8.5.3 函数结构和调用规则 1、函数如何进行调用 主调函数在调用另一个函数时完成以下工作(ARP必须为AR1): (1)主调函数以逆顺序将参数压入堆栈(最右边的参数最先压入,最左边的 参数最后压入)。函数调用时最左边的放在堆栈顶部。 (2)主调函数调用被调函数。 (3)主调函数假定在函数返回时ARP会被设定为AR1。 (4)当被调函数结束,主调函数用以下命令将参数弹出堆栈。 SBRK n 2、被调函数响应(函数入口时ARP应该设为AR1,AR1用作SP) (1)从硬件堆栈中弹出返回地址,并将其压入软件堆栈; (2)将帧指针FP压入软件堆栈; (3)分配局部帧; (4)如果被调函数修改AR6或AR7,将其压入堆栈。其他被修改的寄存器可 以不保存; (5)执行函数代码; (6)如果函数返回标量值,将返回值放入累加器。如果返回值为16位整型和 指针,在用累加器保存返回值时进行正确的符号扩展; (7)将ARP改为AR1; (8)如果保存了AR6或AR7,则恢复AR6或AR7; (9)释放局部帧; (10)恢复FP; (11)将返回地址从软件堆栈中弹出并压入硬件堆栈; (12)返回。 ;假定ARP=AR1 POPD *+ ;将返回地址从硬件堆栈弹出,压入软件堆栈 SAR AR0,*+ ;将AR0(FP)压入堆栈 SAR AR1,* ;*SP=SP LAR AR0,#SIZE ;FP=帧大小 LAR AR0,*0+ ;FP=SP,SP+=SIZE→分配局部帧空间 SAR AR6,*+ ;AR6压栈 SAR AR7,

文档评论(0)

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

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

1亿VIP精品文档

相关文档