Keil c與彙編

在寫這片文章之前,寫了個試驗程序,但總是通不過,查看彙編代碼發現c文件中的語句根本沒有被編譯進去,怎麼也找不到原因,鬱悶~~ 
      最後在網上搜了個試驗程序,把我的程序複製過去,可以編譯成功,奇怪了,在我的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

還要說的是,函數名前要加下劃線,表示是有參數傳遞的函數調用!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章