ccs是乙個完整的dsp整合開發環境。ccs最初由godsp公司為c6000系列設計,後來ti公司受夠了godsp公司,並將ccs擴充套件到其他系列,成為乙個多平台的整合開發環境。ccs支援c語言、組合語言、.h檔案、.cmd檔案。
彙編和c的相互呼叫可以分為以下幾種情況:
彙編中訪問c中的變數和函式
c函式呼叫彙編子程式時,匯程式設計序中所有變數名和子函式名前加下劃線「_」,例如使用_sum作為組合語言程式子函式名。同理如果彙編中定義了變數,必須加字首下劃線c函式才能使用該變數。字首下劃線只在c編譯時使用,在c函式中使用彙編函式和變數時不需要加字首下劃線。
當c語言和彙編使用統一變數時,在匯程式設計序中必須使用.global、.def、.ref定義成全域性變數。
在彙編中呼叫c語言的函式時,如果沒有引數傳遞,直接使用_funcname,如果有引數傳遞,則使用暫存器來傳遞相應的引數,如下表(以dspc5509為例)
引數型別
暫存器安排順序
16位資料指標
ar0 ar1 ar2 ar3 ar4
23位資料指標
xar0 xar1 xar2 xar3 xar4
16位資料
t0 t1 ar0 ar1 ar2 ar3 ar4
32位或40位資料
ac0 ac1 ac2
如函式為:
intfn(int i1,long l2,int *p3)其引數傳遞使用暫存器t0,ac0,ar0傳遞,函式返回值通過t0傳遞。
(2)c程式中訪問彙編中的變數
如果需要在c程式中訪問彙編中的變數,則匯程式設計序中的變數名必須以下劃線為首字元,並用.global宣告為全域性變數,如果需要訪問彙編中的過程,則過程名必須以下劃線為首字元,並且要根據c程式編譯時使用的模式是stack-basedmodel還是register argumentmodel類正確的編寫該過程,使之能正確的取得呼叫引數。
以下為本人試驗的例子
以下為本人**驗證,main.c為c語言函式,cas.asm為彙編**。
main.c
#include
externint addfunc(int *p);
//c語言呼叫彙編中的過程用extern
宣告為外部函式
int globla=10;
//c中定義的全域性變數在彙編中使用用.global
宣告為全域性變數
int subfunc(int a,int b)
//彙編中會呼叫該函式需在彙編中用.global
宣告為全域性函式
void main()
彙編部分**
cas.asm
.global_addfunc
;注意此處開頭應空一格不然出現synaxerror
.global _subfunc
;彙編呼叫c
語言中定義的函式
.global_globla
_addfunc:
;彙編中定義的過程若要被c
呼叫必須加下劃線
mov *ar0,ar1
add*(#_globla),ar1,ar1
mov ar1,t0
mov #10h,t1
call_subfunc
;此處使用暫存器t0
,t1給subfunc
傳遞引數,並且通過t0
返回結果
ret在ccs中新建專案,新增庫檔案及.cmd檔案執行結果為
sum=9
globla=2
C和彙編混合程式設計
c和彙編混合程式設計 嵌入式裡面用到彙編的地方 開機時的硬體系統的初始化,包括cpu的狀態設定,中斷使能主頻設定,以及ram控制引數以及初始化一些中斷處理方面涉及一些彙編。c中內嵌彙編大多數為arm和thumb指令,其中注意 1 不能直接向pc賦值,程式跳轉用b或者bl指令 2 使用物理暫存器不能使...
C 彙編的混合程式設計
aptcs arm thumb 程式呼叫規範 pcs規定了應用程式的函式可以如何分開地寫,分開地編譯,最後將它們連線在一起,所以它實際上定義了一套有關過程 函式 呼叫者與被呼叫者之間的協議。協議規定 呼叫函式如何傳遞引數 即壓棧方法,以何種方式存放引數 被呼叫函式 如何獲取引數,以何種方式傳遞函式返...
C和彙編混合程式設計 do while
環境 vc do while 會先執行do裡面的迴圈體,執行完去執行while的條件判斷,如果為真,繼續執行do裡面的迴圈體,如果為假,則結束迴圈 c程式 上面先執行sum i i 接著執行i 100,如果為true,則繼續執行do迴圈,否則,結束迴圈。反彙編 5 int i 1,sum 0 004...