[英]Converting C Code Into Assembly Mips Language
嗨,我是整個MIPS匯編代碼的新手,並試圖通過在線幫助資源來自學。 我可以理解它的某些部分以及它是如何工作的。 我現在需要解決的問題是
int A[50], B[50];
for (i=1; i < 50; i++) {
A[i] = A[i] + B[i-1] / A[i-1];
}
希望擴展我的知識,將非常感謝一些技巧和指示。 我已經嘗試過這些在線內容,但似乎並不能幫助我學習。
這是編譯器如何翻譯此類代碼。
這是C代碼,但嚴格等於您的原始代碼,並且以這樣的方式編寫:每個C指令都可以映射到asm指令。 我什至寫了應該使用的指令。
int * pA=&A[0]; // mov
int * pB=&B[0]; // mov
int i=1; // addi
int n=50; // addi
do{
// body of for loop
int B_1=*(pB-1) ; // lw
int A_1=*(pA-1) ; // lw
int D=B_1/A1; // div
int A=*pA; // lw
A += D; // add
*pA = A; // sw
// increment part of the loop
i+=1; // addi
pA+=1; // addi
pb+=1; // addi
// test part of the loop
while (i<N); // blt -> do
}
您只需為所有變量選擇一個寄存器(例如,選擇將復制的pA
復制到$t3
(或r4
或其他r4
)中,並弄清楚如何在asm中翻譯此指令。查看MIPS文檔,翻譯應該很容易。
盡管有幾件重要的事情要知道。
指針與處理器處理的內存地址相似,除了涉及增量(或一般而言,指針算術)時。 如果p
是指向C中類型T
的元素的指針,則p++
表示p
將指向類型T
的下一個元素。 對於地址,必須考慮類型的大小 。 如果一個int
是4個字節,則“指向下一個int”將對應於“添加到一個int的地址”(即4)。
lw
和sw
使用基於地址的地址,即它們可以將立即數添加到地址。 指針算法也很重要。 因此,如果p
是一個int
指針,並且要實現x=*(p+2)
,假設x
在$t4
, p
在$t7
,則必須執行lw $t4,8($t7)
,這意味着讀取地址$t7+8
處的內存(如8==2*sizeof(int)
。
編寫第一個代碼應該不會太困難。 然后,您可以嘗試對其進行優化。 例如,也許在每次迭代時加載A[i-1]
都沒有用? 也許您可以減少變量(寄存器)的數量?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.