簡體   English   中英

無法將此C代碼轉換為MIPS匯編

[英]Cannot translate this C code to MIPS Assembly

基本上,我需要將此C代碼( http://pastebin.com/7EupfQ5n )轉換為MIPS程序集。 我對此表示懷疑,但遇到了麻煩。

到目前為止,我所擁有的是這個( http://pastebin.com/LpS6Mqr1 )。 但是,當我在模擬器中運行代碼時,盡管我將其放入數組,但它仍在無限循環中運行,而且我找不到執行此操作的位置。 我會假設它在while和if語句中以不正確的方式引用了數組,但是我不確定如何或為什么。

如果有人可以提供幫助,將不勝感激。

另外,有沒有辦法為Mac OSX提供C到MIPS編譯器(轉換器?)? 我已經安裝了GCC,但是-mips標志為我生成了一個錯誤。 謝謝!

下次,請使用調試器或模擬器逐步執行代碼。 您可能已經注意到了一些明顯的錯誤。

  1. 您的所有move (偽)指令都將相反。 應該是move destination, source
  2. 為了安全起見,應在開始時用零初始化$s0
  3. bge $s3, $t4, sumBetween1If3 (第87行)使用了錯誤的寄存器(復制粘貼錯誤?)。 應該是bge $s4, $s6, sumBetween1If3
  4. 您應該刪除第97行,因為這在當前形式中是無用的,並且如果交換操作數,則完全有害(這將破壞$s5的總和)。
  5. 不知道您想對第98-100行做什么,因為您沒有在其他地方使用$ra或堆棧。 因此,這些行將兩者都弄亂了,並導致了無限循環。 只需刪除這3行。

有趣的是,您的數組訪問還可以。 盡管有很多改進的可能性,但是最顯着的是,不需要兩次加載數組項。 我假設您打算刪除所有只會執行下一條指令的多余跳轉。

最簡單的檢查方法是將匯編代碼與編譯器生成的輸出進行比較。

如果您已經在計算機上安裝了clang,則不需要gcc來執行此操作(並執行創建跨平台編譯器所需的所有繁瑣步驟)。 但是,不幸的是,Mac上安裝的clang版本不支持mips,因此您必須直接從llvm網站獲取clang,或者在linux機器上進行操作。 聽到c聲后,只需運行

clang -S -target mips -o mips.asm ./your_file.c

並將您的匯編代碼與mips.asm文件進行比較。

我在這里包括了命令的輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM