簡體   English   中英

將C代碼轉換為匯編Mips語言

[英]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文檔,翻譯應該很容易。

盡管有幾件重要的事情要知道。

  1. 指針與處理器處理的內存地址相似,除了涉及增量(或一般而言,指針算術)時。 如果p是指向C中類型T的元素的指針,則p++表示p將指向類型T的下一個元素。 對於地址,必須考慮類型的大小 如果一個int是4個字節,則“指向下一個int”將對應於“添加到一個int的地址”(即4)。

  2. lwsw使用基於地址的地址,即它們可以將立即數添加到地址。 指針算法也很重要。 因此,如果p是一個int指針,並且要實現x=*(p+2) ,假設x$t4p$t7 ,則必須執行lw $t4,8($t7) ,這意味着讀取地址$t7+8處的內存(如8==2*sizeof(int)

編寫第一個代碼應該不會太困難。 然后,您可以嘗試對其進行優化。 例如,也許在每次迭代時加載A[i-1]都沒有用? 也許您可以減少變量(寄存器)的數量?

暫無
暫無

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

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