2012-09-18 35 views
1

我想從我的C程序中調用匯編(特別是MIPS)代碼,並從彙編中調用C返回。
我已經決定在GNU GCC上作爲我的編譯器,(我也猜測我需要一個模擬器?)
我在x86 Win 7機器上。 有些東西對我來說很不清楚,這可以/應該如何解決。從C調用Mips

  • 如果MIPS將使用帶有32個寄存器的加載存儲archi,並且C將繼續使用寄存器archi,因爲我在x86上?
  • 現在我想調用mips程序集而不是x86程序集,可以/還可以使用asm()嗎?
  • 如果MIPS使用比C更多的寄存器,我將能夠從我的C代碼訪問這些寄存器嗎?

任何人都可以幫我解決這個問題,也許通過指出我可以從哪裏學到這一點魔法?

感謝

免責聲明:我工作的程序自修改項目在學校的信用覈查,且該代碼將被用來作爲一個例子,但我沒有得到任何信用此代碼。

+0

您是否已經選擇了編譯器?調用約定將會是編譯器特定的。 –

+0

MIPS代碼有多複雜?它會調用系統調用嗎?如果不是,它的模擬器更容易編寫。你必須弄清楚仿真器和你的C代碼之間來回傳遞數據的艱難細節...... – nneonneo

+0

我將使用GNU GCC作爲我的編譯器 MIPS只會從我的c程序 - 沒有系統調用。 –

回答

2

最常見的MIPS調用約定被描述爲here。編寫C可調用匯編程序的最簡單方法是在C中爲例程編寫一個框架,然後將編譯器輸出的彙編代碼複製到彙編源代碼中(使用gcc的-S選項)。假設您想調用C中定義的彙編程序函數int foo(int a, int b)。您可以在C中編寫該函數的簡單版本。例如,把下列foo.c的:

int foo(int a, int b) { 
    return a+b; // some simple code to access all arguments and the return value 
} 

然後你會使用MIPS交叉編譯器編譯功能使用-S-O0選項與gcc,這將產生一個文本輸出文件(見下文)foo.S爲您提供MIPS彙編程序源代碼以訪問函數foo的參數,並向您顯示返回值的放置位置。只需將該源文件複製到您自己的彙編源代碼中,然後添加計算所需的彙編程序計算foo

從程序集中調用C很容易,一旦你調用了另一個方向就知道了。

您可以從Mentor Graphics(之前的Codesourcery)下載免費的MIPS gcc cross compiler工具鏈。

您可以從here下載一個免費的,功能完整的(啓動並運行Linux)MIPS模擬器。不要使用SPIM或MARS,因爲它們不能完全建模MIPS架構。

+0

我想那將是MIPS調用con,我想知道,C調用con會是什麼。我不明白的部分是如果C仍然在x86上運行,並且如果是的話,這些寄存器映射到哪裏(我想這很容易查找)。 (本質上,我問C是否可以用於加載商店archi) 我會查找這些鏈接,謝謝! 但我不太明白你的第一段...如果我打電話給mips代碼,我仍然使用asm()嗎? –

+2

要做你正在提出的建議,你需要使用上面提到的gcc工具鏈來交叉編譯你的C程序和你的MIPS asm程序到MIPS二進制文件中,然後在MIPS模擬器或真正的MIPS硬件上運行它。交叉編譯器在x86計算機上運行,​​但生成的二進制文件只能在MIPS模擬器或MIPS計算機上運行。它不會在x86上運行。 – markgz

+0

在第一段中增加了更多細節。 – markgz