最後在網上搜了個試驗程序,把我的程序複製過去,可以編譯成功,奇怪了,在我的project裏就是不行,我注意到我的project編譯後出現一條WARNING:
*** WARNING L7: MODULE NAME NOT UNIQUE
MODULE: 8.obj (8)
而同樣的程序代碼在另外一個project中沒有WARNING,肯定是這條WARNING語句導致的,裏面提到NAME,難道和名字有關,馬上把A51文件改個名字(原來c文件和a51文件名字一樣),編譯,哈哈,WARNING不見了,查看彙編代碼,一切按預想的進行,唉,一個名字害得我不淺啊,記住哦,c文件和A51文件不能使用同一個文件名,不過我還不知道爲什麼會這樣,有高手知道得話請告知,還是進行今天的作業吧!
今天說說帶參數傳遞的函數調用,在C51和彙編之間傳遞參數的方式有兩種,一種是通過寄存器傳遞參數,C51中不同類型的實參會存入相應的寄存器,在彙編中只需對相應寄存器進行操作,即達到傳遞參數的目的。
不同類型的數據及其傳遞參數的寄存器如下表所示:
參數類型 | char | int | long/float | 通用指針 |
第1個 | R7 | R6&R7 | R4-R7 | R1-R3 |
第2個 | R5 | R4&R5 | R4-R7 | R1-R3 |
第3個 | R3 | R2&R3 | -- | R1-R3 |
舉個例子吧,void delay(unsigned char i, unsigned int j) 當執行語句delay(10,1000)時,10會存入R7中,1000高位會存入R4中,低位存入R5中。在彙編語句中從這幾個寄存器中取數,再進行操作就行了,說起來也很簡單的嘛,呵呵~
來個最簡單的實例吧,沒什麼意義,傻瓜式的程序:
****************************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
還要說的是,函數名前要加下劃線,表示是有參數傳遞的函數調用!