[英]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.