我正試圖學習MIPS ISA。如果我想做這個功能MIPS:在MIPS彙編中交換數組中的兩個元素
A[2*i]=A[2*k+j];
我怎麼會去嗎?我也希望能夠閱讀其他任何內容,即我可以閱讀如何解決這類問題的鏈接。
我正試圖學習MIPS ISA。如果我想做這個功能MIPS:在MIPS彙編中交換數組中的兩個元素
A[2*i]=A[2*k+j];
我怎麼會去嗎?我也希望能夠閱讀其他任何內容,即我可以閱讀如何解決這類問題的鏈接。
我們可把此下降到2份:
我只是要解決(ahem)#1。
要計算一個數組元素的地址,你需要知道的三兩件事:
我假設你知道如何計算,或者只知道#1 &#3。這就留下了#2,其中涉及簡單的算術。 (既然你沒有說明我是如何表現的,我不能在那裏幫忙太多)。
最後一步是將索引乘以數組元素的大小;這會爲您提供數組開頭的所需元素的偏移量。將它添加到數組開始的地址,並且您有元素的地址。
P.S.您正在翻譯的代碼不會交換兩個元素;它複製一個在另一個之上。
這已經有一段時間了,但這可能會接近。如果不嘗試自己,你永遠不會學習彙編語言。製作更多示例並對其進行編碼。更多學習資料here。
# int calc(int *A, int i, int j, int k)
# {
# return A[2 * i] = A[2 * k + j];
# }
# Args: a0=A, a1=i, a1=j, a3=k Rtn: v0
.text
.set nomacro
.set noreorder
.global calc
.ent calc
calc:
sll $t0, $a1, 3 ; t0 = i * 8
sll $t1, $a3, 1 ; t1 = k * 2
add $t1, $t1, $a1 ; t1 += j
sll $t1, $t1, 2 ; t1 *= 4
add $t0, $t0, $a0 ; t0 += A
add $t1, $t1, $a0 ; t1 += A
lw $v0, 0($t1) ; r = A[4 * (2 * k + j)]
sw $v0, 0($t0) ; A[4 * (2 * i)] = r
.end calc
.global應該是.globl – Wiz
謝謝。我在這裏使用了例子中的語法:http://www.mips.com/media/files/MD00565-2B-MIPS32-QRC-01.01.pdf也許不同的彙編程序使用不同的關鍵字。 – Gene