寄存器按照保护方式分为两种:
? 调用保存(save on call),调用其它函数的函数负责保存这些寄存器的内容。
? 入口保存(save on entry),被调用的函数负责保存这些寄存器的内容。
注:无论是否使用优化编译,都必须遵守这些寄存器规则。
寄存器的使用和保护
Yes
寄存器变量
AR6-AR7
No局部变量指针( LVP)AR2
Yes帧指针( FP)AR0
No
表达式运算/返回值
Accumulator
No
表达式运算
AR3-AR5
Yes堆栈指针( SP)AR1
调用时保护用途寄存器状态寄存器(ST0、ST1)单元
0
乘法移位模式
PM
-
符号扩展模式
SXM
0
溢出模式
OVM
-
数据页
DP
1
辅助寄存器指针
ARP
-
测试模式
TC
-
溢出标值
OV
-
进位标志
C
假定值名称单元对于有假定值(为 0或为 1)的状态寄存器单元,在进行函数调用和函数返回时必须保证其值为假定值。
13.2.6 函数结构与调用规则
TMS320C2x/C2xx/C5x运行环境对函数调用有严格的要求,要调用C函数或要被C程序调用的汇编语言程序必须遵守这些规则,否则可能破坏C运行环境,造成程序失败。
?当进行函数调用时,调用者要将传递参数压入系统堆栈传给被调用的函数,并将函数返回地址压栈。
?被调用的函数要在函数运行结束时将返回值放在累加器里返回给调用者函数。
可见函数参数及返回地址等都是通过堆栈传递的,要编写汇编函数,必须明确函数调用的过程中堆栈的变化和应该进行的处理进行函数调用过程中系统堆栈的变化
? 调用函数的工作:
?将参数反向压入堆栈(最右端的参数最先压栈,最左端的参数最后压栈),这样,当函数被调用时,最左端的参数会在堆栈的最顶部。
?调用被调用函数。
?当被调用函数返回时,调用者函数假定ARP已被设置为
AR1。
?当被调用函数运行结束时,调用者函数要将压入堆栈的参数弹出以恢复堆栈状态。
注:如果用C程序调用汇编语言程序,C编译器会自动产生代码完成这些工作。
? 被调用函数的工作:
?进入函数时,函数假定ARP已经被设定为AR1。
?将返回地址从硬件堆栈弹出,压入软件堆栈。
?将FP(SP)压入软件堆栈。
?分配局部帧。
?如果函数中要修改AR6、AR7,将它们压入堆栈,其它寄存器不用进行保护就可以进行修改。
?实现函数功能。
?如果函数返回标量数据,将它放入累加器。
?将ARP设定为AR1。
?如果保护了AR6、AR7,恢复这两个寄存器。
?删除局部帧。
?恢复FP(SP)。
?将返回地址从软件堆栈中弹出,压入硬件堆栈。
?返回。
?一些特殊的情况:
?返回一个结构:当函数的返回值为一个结构时,调用者函数负责分配存储空间,并将存储空间地址作为最后一个输入参数传递给被调用函数。被调用函数将要返回的结构拷贝到这个参数所指向的内存空间。
?不将返回地址移动到软件堆栈:当被调用函数不再调用其它函数,
或者确定调用深度不会超过8级,可以不用将返回地址移动到软件堆栈。
?不分配局部帧:如果函数没有输入参数,不使用局部变量,就不需要修改AR0(FP),因此也不需要对其进行保护。
13.2.7 C程序调用汇编函数
C程序调用汇编函数必须要满足前面介绍的调用规则和寄存器规则,C程序可以访问汇编语言定义的变量或调用汇编语言函数,同样汇编语言也可以访问C程序定义的变量或调用
C函数。
用C程序调用汇编函数有以意事项:
? 所有的函数(不论用C编写还是用汇编语言编写)都必须满足前面介绍的寄存器规则。
? 对于一些寄存器,如果函数要修改其内容,则必须事先对其进行保护。这些寄存器包括:
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-29489-50.html
没有捕捉到美舰的动向
伊凡份子给老萨提鞋的资本都木油