在寫這片文章之前,寫了個(gè)試驗(yàn)程序,但總是通不過,查看匯編代碼發(fā)現(xiàn)c文件中的語(yǔ)句根本沒有被編譯進(jìn)去,怎么也找不到原因,郁悶~~ 最后在網(wǎng)上搜了個(gè)試驗(yàn)程序,把我的程序復(fù)制過去,可以編譯成功,奇怪了,在我的project里就是不行,我注意到我的project編譯后出現(xiàn)一條WARNING:
*** WARNING L7: MODULE NAME NOT UNIQUE MODULE: 8.obj (8)
而同樣的程序代碼在另外一個(gè)project中沒有WARNING,肯定是這條WARNING語(yǔ)句導(dǎo)致的,里面提到NAME,難道和名字有關(guān),馬上把A51 文件改個(gè)名字(原來c文件和a51文件名字一樣),編譯,哈哈,WARNING不見了,查看匯編代碼,一切按預(yù)想的進(jìn)行,唉,一個(gè)名字害得我不淺啊,記住哦,c文件和A51文件不能使用同一個(gè)文件名,不過我還不知道為什么會(huì)這樣,有高手知道得話請(qǐng)告知,還是進(jìn)行今天的作業(yè)吧! 今天說說帶參數(shù)傳遞的函數(shù)調(diào)用,在C51和匯編之間傳遞參數(shù)的方式有兩種,一種是通過寄存器傳遞參數(shù),C51中不同類型的實(shí)參會(huì)存入相應(yīng)的寄存器,在匯編中只需對(duì)相應(yīng)寄存器進(jìn)行操作,即達(dá)到傳遞參數(shù)的目的。
不同類型的數(shù)據(jù)及其傳遞參數(shù)的寄存器如下表所示: |
| 參數(shù)類型 | char | int | long/float | 通用指針 |
| 第1個(gè) | R7 | R6&R7 | R4-R7 | R1-R3 |
| 第2個(gè) | R5 | R4&R5 | R4-R7 | R1-R3 |
| 第3個(gè) | R3 | R2&R3 | -- | R1-R3 |
舉個(gè)例子吧,void delay(unsigned char i, unsigned int j) 當(dāng)執(zhí)行語(yǔ)句delay(10,1000)時(shí),10會(huì)存入R7中,1000高位會(huì)存入R4中,低位存入R5中。在匯編語(yǔ)句中從這幾個(gè)寄存器中取數(shù),再進(jìn)行操作就行了,說起來也很簡(jiǎn)單的嘛,呵呵~
來個(gè)最簡(jiǎn)單的實(shí)例吧,沒什么意義,傻瓜式的程序: ****************************main.c*********************************************
extern void DELAY(unsigned char i,unsigned int j);
main()
{
DELAY(10,1000);
while(1);
}
**********************DELAY.A51********************************************
?PR?_DELAY?DELAY SEGMENT CODE
PUBLIC _DELAY
RSEG ?PR?_DELAY?DELAY
_DELAY:
DJNZ R4,$
DJNZ R5,$
DJNZ R7,$
RET
END
還要說的是,函數(shù)名前要加下劃線,表示是有參數(shù)傳遞的函數(shù)調(diào)用!