Keil中C語言與匯編語言混合編程_百度文庫_第1頁
Keil中C語言與匯編語言混合編程_百度文庫_第2頁
Keil中C語言與匯編語言混合編程_百度文庫_第3頁
Keil中C語言與匯編語言混合編程_百度文庫_第4頁
Keil中C語言與匯編語言混合編程_百度文庫_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、keil C語言與匯編語言混合編程1. C語言中嵌入匯編1、在 C 文件中要嵌入匯編代碼片以如下方式加入匯編代碼:#pragma ASM; Assembler Code Here#pragma ENDASM2、在 Project 窗口中包含匯編代碼的 C 文件上右鍵,選擇“Options for .”,點擊右邊的“Generate Assembler SRC File”和“Assemble SRC File”,使檢查框由灰色變成黑色(有效狀態(tài);3、根據選擇的編譯模式,把相應的庫文件(如 Small 模式時,是 KeilC51LibC51S.Lib加入工程中, 該文件必須作為工程的最后文件;4、

2、編譯,即可生成目標代碼。來個實例吧:i nclude void main(voidP2=1;#pragma asm          MOV R7,#10DEL:MOV R6,#20          DJNZ R6,$          DJNZ R7,DEL#pragma endasmP2=0;2 . 無參數傳遞的函數調用C51調用匯編函數1.無參數傳遞的函數調用*example.c*extern void delay100(;main(de

3、lay100;*example.a51*?PR?DELAY100 SEGMENT CODE; /        在程序存儲區(qū)中定義段PUBLIC DELAY100;      /聲明函數RSEG ?PR?DELAY100;    /函數可被連接器放置在任何地方DELAY100/P>        MOV R7,#10DEL:              MOV R6,#20  

4、60;     DJNZ R6,$        DJNZ R7,DEL        RETEND在example.c文件中,先聲明外部函數,然后直接在main中調用即可。在example.a51中,?PR?DELAY100 SEGMENT CODE;        作用是在程序存儲區(qū)中定義段,DELAY100為段名,?PR?表示段位于程序存儲區(qū)內PUBLIC DELAY100;          作用是

5、聲明函數為公共函數RSEG ?PR?DELAY100;          表示函數可被連接器放置在任何地方,RSEG是段名的屬性段名的開頭為PR,是為了和C51內部命名轉換兼容,命名轉換規(guī)律如下:CODE ?PR?XDATA?XDDATA?DTBIT?BIPDATA?PD3. 有參數傳遞的函數調用          記住哦,c文件和A51文件不能使用同一個文件名,不過我還不知道為什么會這樣,有高手知道得話請告知。           

6、  今天說說帶參數傳遞的函數調用,在C51和匯編之間傳遞參數的方式有兩種,一種是通過寄存器傳遞參數,C51中不同類型的實參會存入相應的寄存器,在匯編中只需對相應寄存器進行操作,即達到傳遞參數的目的。        不同類型的數據及其傳遞參數的寄存器如下表所示:在C和匯編混合編程的時候,存在C語言和匯編語言的變量以及函數的接口問題。在C程序中定義的變量,編譯為.asm文件后,都被放進了.bss區(qū),而且變量名的前面都帶了一個下劃線。在C程序中定義的函數,編譯后在函數名前也帶了一個下劃線。例如:extern int num就會變成 .bss _num

7、, 1extern float nums5就會變成.bss _nums, 5extern void func ( 就會變成 _func,一 匯編和C的相互調用可以分以下幾種情況:(1) 匯編程序中訪問c程序中的變量和函數。在匯編程序中,用_XX就可以訪問C中的變量XX了。訪問數組時,可以用_XX+偏移量來訪問,如_XX+3訪問了數組中的XX3。在匯編程序調用C函數時,如果沒有參數傳遞,直接用_funcname 就可以了。如果有參數傳遞, 則函數中最左邊的一個參數由寄存器A給出,其他的參數按順序由堆棧給出。返回值是返回到A寄存器或者由A寄存器給出的地址。同時注意,為了能夠讓匯編語言 能訪問到C語

8、言中定義的變量和函數,他們必須聲明為外部變量,即加extern 前綴。(2) c程序中訪問匯編程序中的變量如果需要在c程序中訪問匯編程序中的變量,則匯編程序中的變量名必須以下劃線為首字符,并用global使之成為全局變量。如果需要在c程序中調用匯編程序中的過程,則過程名必須以下劃線為首字符,并且,要根據c程序編譯時使用的模式是stack-based model還是register argument model來正確地編寫該過程,使之能正確地取得調用參數。(3) 在線匯編在C程序中直接插入 asm(“*”,內嵌匯編語句,需要注意的是這種用法要慎用,在線匯編提供了能直接讀寫硬件的能力,如讀寫中斷控

9、制允許寄存器等,但編譯器并不檢查和分析在線匯編語言,插入在線匯編語言改變匯編環(huán)境或可能改變C變量的值可能導致嚴重的錯誤。二 匯編和C接口中尋址方式的改變:需 要注意的是,在C語言中,對于局部變量的建立和訪問,是通過堆棧實現的,它的尋址是通過堆棧寄存器SP實現的。而在匯編語言中,為了使程序代碼變得更為精 簡,TI在直接尋址方式中,地址的低7位直接包含在指令中,這低7位所能尋址的具體位置可由DP寄存器或SP寄存器決定。具體實現可通過設置ST1寄存器 的CPL位實現,CPL=0,DP尋址,CPL=1,SP尋址。在DP尋址的時候,由DP提供高9位地址,與低7位組成16位地址;在SP尋址的時候, 16位

10、地址是由SP(16位與低7位直接相加得來。由于在C語言的環(huán)境下,局部變量的尋址必須通過SP寄存器實現,在混合編程的時候,為了使匯編語言不影響堆棧寄存器SP,通常的方式是在匯編環(huán)境中使用DP方式尋址,這樣可以使二者互不干擾。編程中只要注意對CPL位正確設置即可1 .word 的意思就相當與C語言里的int,char等定義一個變兩的寬度2. 編譯錯誤原因有2:a.如果在匯編里面定義.global(全局符號),那么在C語言里面應該用extern聲明,以引用該符號。 b.在匯編里面聲明的時候,符號前應加下劃線,如 FIQ_Addr: .word EXTint_FIQ 應為: FIQ_Addr: .wo

11、rd _EXTint_FIQ 在C語言里面應用extern聲明。 另外,一中方法是,用.ref 代替.global 來聲明符號,這樣就不用在C源程序里面用extern聲明了。 兩種方法結果相同。 我講的是用C和匯編混編程用法,至于C+變量如何翻譯成匯編符號可以用仿真器,自己去看,原則類似.匯編與C語言混合編程的關鍵問題1 C程序變量與匯編程序變量的共用     為了使程序更易于接口和維護,可以在匯編程序中引用與C程序共享的變量:     .ref_to_dce_num,_to-dte_num,_to_dce_buff,_to_dte_buff  

12、;   在匯編程序中引用而在C程序可直接定義的變量:     unsigned char to_dte_buffBUFF_SIZE;    /DSP發(fā)向PC機的數據     int to_dte_num;                          /緩沖區(qū)中存放的有效字節(jié)數     int to_dte_store;       

13、                 /緩沖區(qū)的存放指針     int to_dte_read;                          /緩沖區(qū)的讀取指針     這樣經過鏈接就可以完成對應。     2 程序入口問題     在C程序中,程序的入口是main(函數。而在匯編程序中其入口由*.cmd

14、文件中的命令決定,如:-e main_start;程序入口地址為 main _start。這樣,混合匯編出來的程序得不到正確結果。因為C到ASM的匯編有默認的入口c-int00,從這開始的一段程序為C程序的運行做準備工作。這些工作包括初始化變量、設置棧指針等,相當于系統殼不能跨越。這時可在*.cmd文件中去掉語句:-e main_start。如仍想執(zhí)行某些匯編程序,可以C函數的形式執(zhí)行,如:     main_start(;            /其中含有其他匯編程序     但前提是在匯編程

15、序中把_main_start作為首地址,程序以rete結尾(作為可調用的函數的程序段,并在匯編程序中引用_main_start,即.ref _main_start。     3 移位問題     在C語言中把變量設為char型時,它是8位的,但在DSP匯編中此變量仍被作為16位處理。所以會出現在C程序中的移位結果與匯編程序移位結果不同的問題。解決的辦法是在C程序中,把移位結果再用0X00FF去“與”一下即可。     4 堆棧問題     在匯編程序中對堆棧的依賴很小,但在C程序中分配局部變量、變量初始化、傳遞函數變量、保存函數返回地址、保護臨時結果功能

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論