簡體   English   中英

使用數組轉換為MIPS匯編語言

[英]Converting to MIPS assembly Language with arrays

並非最擅長轉換,尤其是轉換為MIPS匯編語言。

這是原始代碼:

void swap(int v[], int k, int j) { 
int temp; 
temp = v[k]; 
v[k] = v[j]; 
v[j] = temp; 
}

在一些幫助下,我們設法做到了這一點,現在我需要將其轉換為MIPS匯編代碼,只是剛剛學習Java還是一個菜鳥。 歡迎任何幫助。

k = k << 2;
k = k + v
j = j << 2;
j = j + v
temp0 = load(k)
temp1 = load(j)
store(k) = temp1
store(j) = temp0

好的,這是自動販賣機。 前提偽代碼之上,但我寫的不是從頭開始,根據頂部的HLL。

MIPS ABI符合的。 因此,可以自由更改(即銷毀)參數寄存器。 因此,如果在循環中被調用,則調用者必須在每次調用之前設置a0-a3

#   void
#   swap(int v[],int k,int j)
#   {
#       int temp;
#
#       temp = v[k];
#       v[k] = v[j];
#       v[j] = temp;
#   }

# swap -- swap two elements in an array
#
# arguments:
#   a0 -- pointer to array
#   a1 -- array index "k"
#   a2 -- array index "j"
#
# registers:
#   t0 -- v[k]
#   t1 -- v[j]
swap:
    sll     $a1,$a1,2               # k <<= 2 (i.e. byte offset)
    addu    $a1,$a1,$a0             # get address of v[k]

    sll     $a2,$a2,2               # j <<= 2 (i.e. byte offset)
    addu    $a2,$a2,$a0             # get address of v[j]

    lw      $t0,0($a1)              # fetch v[k]
    lw      $t1,0($a2)              # fetch v[j]

    sw      $t1,0($a1)              # v[k] = v[j]
    sw      $t0,0($a0)              # v[j] = v[k]

    jr      $ra                     # return

更新:

我知道sll代表左移。 addu代表什么?

u “后綴”代表unsigned 但是, 喜歡它在很多其他地方使用。

[ add ]有兩個版本。 簽名版本為add未簽名版本為addu 它們產生完全相同的結果,因為它們都執行相同的補碼加法運算。

唯一的區別是,如果加法導致溢出,則add將生成處理器異常(例如“算術溢出”),而addu 不會 -只會包裝。 sub流和下溢類似。

例如,如果一個寄存器中包含0x7FFFFFFF ,並且您向其中添加一個,則會導致溢出。 那是因為您從最大有符號正值開始,您一個,然后您就處於最大有符號負值 (即稱為“溢出”的“量子躍遷”)。

因此,當添加諸如地址計算之類的可能合法溢出(即以32位“換行”)的內容時,最好使用無符號版本。

這是因為,在mips中,程序的某些部分[代碼/數據/堆棧]可能加載為0x80000000或更高。

例如,堆棧可能從0x80001000開始,如果將足夠的數據壓入該堆棧(即$sp寄存器正使用sub遞減),它將最終到達0x80000000附近。 當您在該地址附近推送/彈出時,會溢出/下溢。

沒有錯-這很自然,並且您不希望處理器在執行push操作的sub時生成異常,因此您使用subu [和/或subiu指令的立即形式]。

如果您還沒有找到它,這里有一個很好的指令集參考[很多人使用]: http : //www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html易於閱讀,涵蓋了您可能需要/使用的大多數說明。

以下是ABI調用約定的簡要概述: http : //www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/altReg.html

暫無
暫無

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

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