????C語言與匯編混合編程(keil)時:1、首先要在Project 窗口中包含匯編代碼的C 文件上右鍵,選擇“Options for ...”

2、然后在Properties選項卡中激活“Generate Assembler SRC File”和“Assemble SRC File”

3、然后把相應(yīng)的庫文件C51S.Lib添加到工程,路徑:在默認安裝盤KEIL/C51/LIB/C51S.Lib。注意庫文件必須是工程的最后一個文件。
4、在c語言中嵌入沒有參數(shù)調(diào)用的匯編程序段用#program asm······#program endasm前后括起來就行。
????嵌入有參數(shù)調(diào)用的程序段未嘗試。
5、C語言調(diào)用匯編函數(shù):
在c程序中用extern···聲明
在匯編中:
?PR?···SEGMENT CODE? //在程序存儲區(qū)中定義段,?PR?表示段位于程序存儲區(qū)內(nèi),轉(zhuǎn)換規(guī)律如? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 下:CODE——?PR??? XDATA——?XD
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? DATA——?DT? BIT——?BI?PDATA——?PD
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ···表示函數(shù)名,轉(zhuǎn)換規(guī)律如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Viod func(void) FUNC無參數(shù)傳遞或不含寄存器的函數(shù)名不作轉(zhuǎn)變轉(zhuǎn)入目
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 標 文件中,名字只是簡單地轉(zhuǎn)為大寫形式;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Void func(char) _FUNC 帶寄存器參數(shù)的函數(shù)名,前面加“_”前綴,它表明
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 這類函數(shù)包含寄存器內(nèi)的參數(shù)傳遞;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Void func(void) reentrant _?FUNC 對于重入函數(shù),前面加“_?”前綴,它表
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 明該函數(shù)包含棧內(nèi)才參數(shù)傳遞(未嘗試);
PUBLIC ···? ? ? ? ? ? ? ? ? ? ? ? ? //聲明函數(shù)為公共函數(shù)
RSEG ?PR?···? ? ? ? ? ? ? ? ? ?//表示函數(shù)可被連接器放置在任何地方,RSEG 是段名的屬性
···:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //程序開始
參數(shù)傳遞說明:

返回值傳遞說明:

全局變量的使用:不推薦在匯編中使用C中定義的全局變量,如果必須要使用,可用如下方法:
????在C程序中聲明全局變量
????在匯編函數(shù)開始聲明?? EXTERN??DATA(變量名)
????直接使用變量
????如全局變量為數(shù)組,則使用變量名+偏移量,以數(shù)組BUFF[5]為例,如要訪問數(shù)組BUFF中的元素BUFF[3],在匯編中先聲明EXTERN? DATA(BUFF),在程序中使用MOV? A,BUFF+03H
6、匯編調(diào)用C程序(未嘗試)
????總體來說混合編程比較復(fù)雜,容易產(chǎn)生問題,一般都是不得已的情況下才會使用。使用中還是盡量使程序模塊化,盡量少使用全局變量;如使用C語言為主,則盡量少的使用匯編,尤其是大段的匯編程序,由于C是自動編譯,使用內(nèi)存地址不確定而匯編是人為指定內(nèi)存地址,容易造成地址復(fù)用產(chǎn)生錯誤,若程序中再加入中斷則情況會變得更復(fù)雜。