- 1、本文档共119页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
表状态寄存器作用字段名称默认值编译器能否修改缓冲冻结否缓冲使能否缓冲清零否主机中断否总线错误标志否微处理器微机模式否饱和模式单元是关闭否乘法饱和模式是存储饱和模式否函数结构和调用规则编译器对函数调用有一套严格的规则除特殊的运行时间支持函数其它任何函数不管调用还是被调用都必须遵循这些规则不满足这些规则会破坏环境并会导致程序失败例一个典型的函数调用父函数如何调用其它函数将所要传递到子函数的参数放入寄存器或堆栈若子函数的参量用省略号声明表示参量数量可变则首先把最后一个显式声明的参量传到堆栈跟在后面再把
表6-10 ST3_55状态寄存器作用 字段 名称 默认值 编译器能否修改 CAFRZ 缓冲冻结 否 CAEN 缓冲使能 否 CACLR 缓冲清零 否 HINT 主机中断 否 CBERR 总线错误标志 否 MPNMC 微处理器/微机模式 否 SATA 饱和模式(A单元) 0 是 CLKOFF CLKOUT关闭 否 SMUL 乘法饱和模式 0 是 SST 存储饱和模式 否 * 6.5.3 函数结构和调用规则 C编译器对函数调用有一套严格的规则。 除特殊的运行时间支持函数, 其它任何函数不管调用还是被调用都必须遵循这些规则。 不满足这些规则会破坏C环境并会导致程序失败。 * 例,一个典型的函数调用。 * 1.父函数如何调用其它函数 (1)将所要传递到子函数的参数放入寄存器或堆栈。 * 若子函数的参量用省略号声明(表示参量数量可变),则首先把最后一个显式声明的参量传到堆栈, 跟在后面再把其它参量传到堆栈。 堆栈地址将作为访问其它未声明参量的索引; 最后一个参量之前所声明的参量遵循下面的规则: 编译器通常先对要传递的参量分类, 然后按照类型将参量放进寄存器(若可用)。编译器使用的参量有3类: 一个函数(父函数)调用其他函数时要进行以下工作: 数据指针(int*, long* 等) 16位数据(char, short, int) 32位数据(long, float, double, 函数指针)或40位 (long long) * 若参量是指向数据类型的指针, 这个参量就是数据指针; 若一个参量能放进16位寄存器, 就可看成16位数据, 否则就是32位数据。40位数据用整个寄存器传送。 双字长(32位)或少于双字长的结构体会被当成32位数据参量, 并通过寄存器(若可用)传递。 若结构体长度大于32位, 则通过索引传输, 即编译器将该结构体的地址作为一个数据指针传递。 (1)将所要传递到子函数的参数放入寄存器或堆栈。 若子函数返回的是一个结构体或联合体, 则父函数在局部(本地)堆栈中为结构体分配相应大小的空间。父函数将该空间地址作为第一个隐含参量传递给子函数, 这个参数被看成一个数据指针。 参量按照在函数声明中的排列顺序被分配给寄存器。参量放置的寄存器类型由参数的类型决定(表6-11)。若参量数量超过可用寄存器数量, 多余参量会被压入堆栈。 参数类型 寄存器分配顺序 对应的数据类型 16或23位数据指针 (X)AR0, (X)AR1, (X)AR2, (X)AR3, (X)AR4 数组,字符串,指针或占用空间超过2字节长的结构体 16位数据 T0, T1, AR0, AR1, AR2, AR3, AR4 (无符号)字符,短整数, 整数 32(40)位数据 AC0, AC1, AC2 长整数,浮点数和长度不大于2个字节的结构体 * 对于放入堆栈的参量按照下述方法处理: 首先将堆栈调整到偶数边界上; 然后, 每一个参数按照相应参数类型在堆栈上排列(long, float, double,代码指针, 大模式数据指针按偶数边界排列, 其他无需按欧边界排列)。 (1)将所要传递到子函数的参数放入寄存器或堆栈。 表6-11 C函数调用中参量与寄存器的排列关系 (2)子函数保存所有的入口保存寄存器(save-on-entry registers: T2、T3、AR5~AR7)。父函数必须通过压入堆栈来保存其它在调用后会用到寄存器的值。 (3)父函数对子函数进行调用。 (4)父函数收集返回值。 短数据、长数据和数据指针分别返回在T0、AC0和(X)AR0中。若子函数返回的是一个结构, 则父函数在本地堆栈中为结构体分配相应大小的空间。 * 父函数将该空间地址作为第一个隐含参量传送给子函数,这个参数被看成一个数据指针。 1.父函数如何调用其它函数, 步骤: (1)将所要传递到子函数的参数放入寄存器或堆栈。 例6-8,寄存器参量规则。 * 这是引用声明 结构体长度大于32位, 编译器将该结构体的地址作为一个数据指针传递。 少于双字长的结构体会被当成32位数据参量, 并通过寄存器传递。 T0 T0 AC0 AR0 int fn(int i1, long l2, int *p3); AC0 AR0 T0 T1 AR1 long fn(int *p1, int i2, int i3, int i4); AR0 AR1 struct big fn (int *p1); T0 AR0 AR1 int fn (struct big b, int *p1); struct big { long x[10]; };。
文档评论(0)