2010-07-15 30 views
2

我想在Sparc中進行一些「內聯」彙編編程,我想知道如何通過寄存器傳遞來實現這一點。Sparc程序調用約定

最好的解釋我的問題有一個小例子

int main() 
{ 
    int a = 5; 
    int b = 6; 
    int res; 

    asm_addition(a,b); 

    printf("Result: %d\n", res); 
    return(0); 
} 
    // My assembler addition 

.global asm_addition    

.align 4 

    add rs1, rs2, rd 
    restore 

有誰知道我登記必須使用,以便值A和B將被添加?最後,我需要使用哪個寄存器來爲rd編寫speficy,以便結果將隨打印程序之後的最後一個printf語句一起打印出來。

非常感謝您的一些意見!

回答

0

調用約定可能取決於操作系統。我假定Solaris。 Google爲system v application binary interface sparc,PDF很容易找到。

完整的內聯彙編程序文檔被隱藏在SunStudio PDF文件的某處,不太容易找到。正式它也可以通過man -s 1 inline訪問,雖然在我的系統中我必須手動打開文件。在手冊頁中,查找「SPARC系統的編碼約定」。

0

在Solaris上,參數通過寄存器%o0傳遞給%o5,然後通過堆棧。如果被調用的函數是一個葉函數(即它不調用另一個函數),則該寄存器窗口不會向前移動,並且函數直接通過%o0到%o5訪問它們。如果註冊窗口被移動,那麼函數可以通過%i0到%i5寄存器訪問參數。返回值的調用方式通過%i0在調用方中變爲%o0。 對於浮點參數,它們通過FP寄存器處理,但您必須閱讀指向的文檔Dummy00001。