在C51中,KeilC與IAR在函數(shù)參數(shù)的傳遞及返回值的處理上,有著較大的不同。本文主要小結(jié)不同,并稍稍發(fā)表Hanny個(gè)人對(duì)這些方式的優(yōu)缺點(diǎn)的看法。
首先,我們對(duì)數(shù)據(jù)類型進(jìn)行分類。根據(jù)數(shù)據(jù)類型的長(zhǎng)度,我們可以將數(shù)據(jù)簡(jiǎn)單分為:bit, u8, u16, u32。其中,bit表示位變量;u8主要為char、signed char、unsigned char型變量;u16主要為short、usigned short、int、unsigned int、point型變量;u32主要為long、unsigned long、float型變量。
然后,先介紹一下函數(shù)參數(shù)的傳入。
首先是bit,KeilC采用的是位尋址區(qū)的變量來進(jìn)行bit型參數(shù)的傳入。而IAR采用的是B寄存器來傳入。
接著是u8,KeilC主要采用R7、R5、R3來進(jìn)行參數(shù)的傳入。也就是說:當(dāng)函數(shù)的參數(shù)為一個(gè)時(shí)使用R7,兩個(gè)時(shí)使用R7和R5,三個(gè)時(shí)就使用R7、R5及R3。同樣的,IAR主要采用R1、R2、R3、R4、R5來進(jìn)行u8型參數(shù)的傳遞。
緊接著是u16,KeilC主要采用R6:R7、R4:R5、R2:R3來進(jìn)行傳入,而IAR采用R3:R2、R5:R4來進(jìn)行傳入。
再接著就是u32,KeilC主要采用R4:R7來進(jìn)行傳入,IAR采用R5:R2來進(jìn)行傳入。
最后,KeilC還支持一種叫做通用數(shù)據(jù)指針的數(shù)據(jù)類型。主要采用R2:R1、R3來傳入。其中,R2:R1存儲(chǔ)指針地址,R3存儲(chǔ)內(nèi)存類型。
然后再說說返回值。
返回值為bit時(shí),KeilC與IAR都用C來傳出。
返回值為u8時(shí),Keil采用R7,而IAR采用R1。
返回值為u16時(shí),Keil采用R6:R7,而IAR采用R3:R2。
返回值為u32時(shí),Keil采用R4:R7,而IAR采用R5:R2。
下面是Hanny的個(gè)人小結(jié):
KeilC的函數(shù)傳入傳出都是秉承KeilC的大端思想,主要用到的寄存器為R7-R2;IAR的函數(shù)傳入傳出是秉承小端思想,主要用到的寄存器為R1-R5。
KeilC函數(shù)參數(shù)傳遞的優(yōu)點(diǎn)是:在從u8向u16、u32擴(kuò)展時(shí),由于低位所處的寄存器位置不變,擴(kuò)展時(shí)對(duì)代碼的修改較小。
IAR的優(yōu)點(diǎn)是:在傳入的參數(shù)位數(shù)為u8時(shí),更緊湊的方式能夠傳入更多的參數(shù)。
相比之下,Hanny更喜歡KeilC這種方式。