大家好,我正在將我的 C 代碼轉換為 MIPS,但問題是在這里我無法為此制定正確的邏輯
for (int i=0;i<count;i )
{
h[a[i]] ;
}
據我所知,我自己的邏輯是錯誤的
假使,假設
a[]=$t1
b[]=$t2
li $s1,0
for:
bgt $s1,[size of array],end
lw $t3,($t1)
la $t1,4($t3)
lw $t4,($t2)
la $t2,4($t2)
sw $t3,0($t4)
add $s1,$s1,1
j for
我知道這是錯誤的..但在 MIPS 中它給了我錯誤的地址錯誤和例外 7 和 4 錯誤
此外,如何將陣列長度放入 MIPS 暫存器,例如 C 如何為您計算元素數量而無需對其進行硬編碼?
int arr[]={1,3,5,7,9};
int n=sizeof(arr)/sizeof(arr[0]);
uj5u.com熱心網友回復:
您需要了解正在增加的內容。獲得這種理解的一種方法是分解:可以使用諸如三地址代碼之類的方法分解運算式。
然后建議,分解這個:
h[a[i]] ;
如下:
int av = a[i];
h[av] ;
在這種方法中,我們將運算式的各種操作和元素分離到它們自己的代碼行中,并使用引入的變數(即臨時變數或短期變數)重新連接它們。
我們可以繼續分解:
int av = a[i];
// decompose h[av] ;
int *hp = h av;
*hp = *hp 1;
但仍然:
int av = a[i];
int *hp = h av;
// decompose *hp = *hp 1;
int hv = *hp;
hv ;
*hp = hv;
這是盡可能分解的。希望您可以 (1) 將其轉換為 MIPS 匯編并 (2) 了解分解技術。
請注意,在 C 語言中,當陣列a具有int元素時,在運算式中,例如a i和h j存在索引 (i和j)與 的隱藏乘法sizeof(int),即 4,稱為在加法之前發生的縮放 - 這種縮放在 C 中是自動的, 必須在匯編中明確完成。
控制結構,即結構化陳述句也可以分解:
for (i = 0; i < count; i ) {
???
}
第一次分解:
i = 0;
while (i < count) {
???
i ;
}
并進一步進入 if-goto-label 樣式:
i = 0;
loop1:
if (i >= count) goto endLoop1;
???
i ;
goto loop1;
endLoop1:
注意回圈退出條件是如何反轉(否定)的——這是因為在 if-goto-label 中,我們寫的是何時退出回圈,而不是 C 中的 for/while 中的何時繼續回圈,這表示完全相反。
(情況并非總是如此:do-while 條件也表示何時繼續回圈,在匯編中,因為這是為回圈的下一次迭代放置反向分支的自然位置,所以條件測驗 do -while 和 if-goto-label 版本將具有相同的條件意義——它們不是相反的——而Pascal 中的 repeat-until使用相反的條件意義。)
另外注意<: is 的反轉/否定/相反 >= 。
分解是通過邏輯等價的變換來簡化。只要我們保持邏輯等價,分解就會和原來的一樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/474097.html
