我試圖將C代碼轉換爲MIPS彙編。有以下兩個C代碼片段。問題是我的解決方案與標準解決方案不同。另外,我不瞭解標準解決方案。我希望有人能向我解釋下面兩個mips彙編代碼片斷。C代碼到MIPS彙編
首先是該任務的一些附加信息。只允許使用以下MIPS指令:lw,add,beq,bne和j。
寄存器:
$ S3包含我
$ S4包含Ĵ
$ S5包含ķ
甲是32位整數的陣列和的起始地址A在$ S6
$ T0和$ T1可用於存儲臨時變量
第一個是一個簡單的do-while循環:
do {
i = i + j;
} while(A[i] == k);
MIPS大會
loop: add $s3, $s3, $s4 // this is i = i+j
add $t1, $s3, $s3 // from now on
add $t1, $t1, $t1 // I cant follow anymore
add $t1, $t1, $s6 // What happens in these three lines?
lw $t0, 0($t1) // 0($t1) is new for me. What does this zero do?
beq $t0, $s5, loop
現在第二個C代碼:
if (i == j)
i = i + A[k];
else if(i == k)
i = i + A[j];
else
i = i + k;
這裏是MIPS彙編代碼:
bne $s3, $s4, Else1 // this line is if(i==j)
add $t1, $s5, $s5 // from here on
add $t1, $t1, $t1 // till
add $t1, $t1, $s6 //
lw $t0, 0($t1) //
add $s3, $s3, $t0 // here I don't understand
j done
ELSE1: bne $s3, $s5, Else2 // this line is if(i==k)
add $t1, $s4, $s4 // The same game as above
add $t1, $t1, $t1
add $t1, $t1, $s6
lw $t0, 0($t1)
add $s3, $s3, $t0 // till here
j done
ELSE2: add $s3, $s4, $s5
任何人都可以解釋我真正的推移?這將是非常有幫助的
確定。現在一切似乎都變得更清晰了。但我有問題的抵消。 ** lw $ t2,0($ t0)**相當於將地址加載到**($ t0 + 0)**。我可以在上面的例子中省略「0」,只是使** lw $ t2,($ t0)**? – tumbler
是的,在我發現的MIPS彙編頁面中,'lw $ t2,($ t0)'是一個有效的表單。 – woolstar
你好,我問題出現了。設計師決定使用兩個加法而不是乘法,也許是因爲你說的性能問題。但爲什麼設計師仍然使用4的乘法?當然,數組中的數字是32位整數。所以,它們是4字節大,但我們不知道變量i,j和k有多大。也許每個人都是4字節大。那麼我們不需要將A []與4相乘得到下一個值?我認爲設計者認爲變量是1個字節大。這是真的嗎? – tumbler