2016-10-02 56 views
0

這些從C等價物的MIPS翻譯之後?如果沒有,請詳細解釋。我的教授說第一版是正確的。如果我寫了類似於第二版的指令,即使它們產生相同的輸出,我也不會得到標記。她沒有解釋爲什麼。先謝謝你 !這兩個MIPS翻譯是否來自C等價物?

C代碼

if (i==j) { f = g + h ; } else f = g -h ;

MIPS版本一個

 bne $s3, $s4, Else 
     add $s0, $s1, $s2 
     j Exit 
    Else: sub $s0, $s1, $s2 
    Exit:... 

MIPS版本二:

  beq $s3, $s4, Else 
     sub $s0, $s1, $s2 
     j Exit 
    Else: add $s0, $s1, $s2 
    Exit:... 

回答

1

你去別的STA當我不等於j時如此使用bne(分支不等於)。什麼你是第二個MIPS描述是代碼:

if (i!=j) { 
    f = g - h ; 
} 
else 
    f = g + h ; 

因此,它是等效的,但是你的第二個MIPS代碼的if-else代碼它描述的東西相當於它並沒有描述的第一,但它是不正確的翻譯。

+0

謝謝。我想我明白了。在某些情況下,它們可能不相同。如果輸入導致執行f = g + h的方式比f = g - h更頻繁。第二個版本可能會減慢這個過程,因爲他們不得不跳轉到else,而是在比較之後直接執行f = g + h。 – Snailwalker

+0

是的,事情是,即使這些是相同的,做同樣的事情,他們不是相同的C代碼翻譯,但相當於你想翻譯C到MIPS ...很高興幫助! – coder

1

我通常會給予他們兩人的滿分,除非該作業是特別遵循翻譯if結構的特定模板。

由於分支結構有差異,但C代碼並沒有強制編譯器專門選擇第一個翻譯(甚至不一定要選擇其中的任何一個),所以我會爭辯說,您不會被迫選擇它。

+0

我同意你的看法,但問題不在於c編譯器如何處理if-else語句,而是如何在MIPS中編寫上述if-else in c。雖然我同意這兩種方式都有相同的結果,但只有第一個是c代碼的精確轉換,第二個MIPS代碼描述了我編寫的第二個c程序(如果當然,我沒有犯任何錯誤),而且他獨立於C編譯器喜歡做什麼選擇......無論如何,我認爲這兩種MIPS都是有效的並且做同樣的事情...... – coder

+0

這真的很有趣!編譯器在什麼情況下選擇第二個翻譯?你能給個例子嗎 。謝謝 。 – Snailwalker

+0

@coder它來自* C雖然,對不對?如果是從集合*到* C,我會同意,不是因爲其他訂單確切地是錯誤的,而是爲了儘可能地保持與原始訂單儘可能接近。但是從C到彙編,如果編譯器有選擇,那麼我們也是,對吧? – harold