在C51中,KeilC与IAR在函数参数的传递及返回值的处理上,有着较大的不同。本文主要小结不同,并稍稍发表Hanny个人对这些方式的优缺点的看法。
首先,我们对数据类型进行分类。根据数据类型的长度,我们可以将数据简单分为:bit, u8, u16, u32。其中,bit表示位变量;u8主要为char、signed char、unsigned char型变量;u16主要为short、usigned short、int、unsigned int、point型变量;u32主要为long、unsigned long、float型变量。
然后,先介绍一下函数参数的传入。
首先是bit,KeilC采用的是位寻址区的变量来进行bit型参数的传入。而IAR采用的是B寄存器来传入。
接着是u8,KeilC主要采用R7、R5、R3来进行参数的传入。也就是说:当函数的参数为一个时使用R7,两个时使用R7和R5,三个时就使用R7、R5及R3。同样的,IAR主要采用R1、R2、R3、R4、R5来进行u8型参数的传递。
紧接着是u16,KeilC主要采用R6:R7、R4:R5、R2:R3来进行传入,而IAR采用R3:R2、R5:R4来进行传入。
再接着就是u32,KeilC主要采用R4:R7来进行传入,IAR采用R5:R2来进行传入。
最后,KeilC还支持一种叫做通用数据指针的数据类型。主要采用R2:R1、R3来传入。其中,R2:R1存储指针地址,R3存储内存类型。
然后再说说返回值。
返回值为bit时,KeilC与IAR都用C来传出。
返回值为u8时,Keil采用R7,而IAR采用R1。
返回值为u16时,Keil采用R6:R7,而IAR采用R3:R2。
返回值为u32时,Keil采用R4:R7,而IAR采用R5:R2。
下面是Hanny的个人小结:
KeilC的函数传入传出都是秉承KeilC的大端思想,主要用到的寄存器为R7-R2;IAR的函数传入传出是秉承小端思想,主要用到的寄存器为R1-R5。
KeilC函数参数传递的优点是:在从u8向u16、u32扩展时,由于低位所处的寄存器位置不变,扩展时对代码的修改较小。
IAR的优点是:在传入的参数位数为u8时,更紧凑的方式能够传入更多的参数。
相比之下,Hanny更喜欢KeilC这种方式。