2013-03-02 80 views
1

教授希望我們使用匯編代碼的程序的一部分程序,然後他希望我們從C程序中調用這個代碼,然後完成時,它跳回到C程序。我似乎無法找到任何文件。如果有問題,我正在使用使用68HC12的Dragon12板。這聽起來不像他希望我們使用內聯asm()函數。如何在CodeWarrior內的C文件中調用匯編代碼?

+0

聽起來好像他希望你編寫彙編代碼來爲你的平臺使用C調用約定,這樣你就可以在C程序中聲明它爲外部函數。 – Neil 2013-03-02 19:59:18

+0

關於這個問題有一個很好的技術說明,你應該在你的Codewarrior安裝的某個地方把它作爲pdf。否則,請在飛思卡爾網站上搜索它。 – Lundin 2013-03-07 13:35:33

回答

1

可以撥打裝配只是定義在C任何正常功能(前提是你使用正確的調用約定)的函數,只要確定返回類型和參數匹配。例如,如果裝配的樣子:

extern int my_func(); 

// ... 
int zero = my_func(); 
-1

找出調用你的函數的正確方法是最簡單的方法就是寫:

my_func: 
    ; assembly code here 
    ; some more assembly code 
    ; etc. 
    xor ax, ax 
    ret 

然後你可以在C如下叫它C語言中的函數具有相同的參數和返回值,在內部進行一些最小化的工作(訪問每個參數,填充結果值)並編譯爲彙編程序。確定你感興趣的每個操作是如何完成的,並且你已經設置好了。

0

的CodeWarrior開發套件10.5幫助菜單文檔介紹瞭如何從C調用純彙編語言函數/ C++代碼如下:

在裝配文件中定義的標籤具有局部範圍。要從其他文件(.c文件)訪問它們,它們應該標記爲全局。例如,.global _my_asm_func

爲了說明,這裏是一個例子的代碼片斷:

.global _my_asm_func 
.text 

_my_asm_func: 
    subq.l #4,a7 
    move.l d1,(a7) 
    add.l (a7),d0 
    addq.l #4,a7 
    rts 

在您的C/C++代碼,首先聲明爲函數的原型。例如,int my_asm_func(int a, int b);。然後像任何其他C/C++函數一樣調用該函數。例如,my_asm_func(5, 2);

注意,在彙編代碼,該函數的前綴以下劃線,但在C/C++事實並非如此。我不確定這是必需的,還是隻是約定。

參數傳遞到連續的數據寄存器。在這種情況下,您會發現5D02D1

0

很久以前的問題,但答案可能仍然有幫助。

對於Kinetis微控制器和gcc, 也許下面的代碼片段可能說明了一個可能性。 (這是我的錯誤處理程序的一部分) 的下面,「PE_ISR」中斷使用內聯彙編程序調用FaultHandlerAsm 功能,這反過來也是內聯彙編。 最後,它分支到一個c函數「faultHandlerC」,這不包括在這裏。

void FaultHandlerAsm(void) 
{ 
    __asm volatile (
    " movs r0,#4  \n" 
    " movs r1, lr  \n" 
    " tst r0, r1  \n" 
    " beq _MSP   \n" 
    " mrs r0, psp  \n" 
    " b _HALT   \n" 
    "_MSP:    \n" 
    " mrs r0, msp  \n" 
    "_HALT:    \n" 
    " ldr r1,[r0,#20] \n" 
    " b FaultHandlerC \n" 
    //" bkpt #0   \n" 
); 
} 

PE_ISR(Cpu_INT_Hard_FaultInterrupt) 
{ 
    __asm( " b FaultHandlerAsm \n"); 
}