- 1、本文档共119页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第6章C语言程序设计-20161028.ppt
表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)