CCS下的C和彙編的混合程式設計

2021-06-07 10:02:37 字數 1727 閱讀 2203

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...