2012-06-07 57 views

回答

0

我們可把此下降到2份:

  1. 計算的地址A [2 * i]和A [2 * K + j]的
  2. 在所述第二地址到存儲器分配值在第一個地址

我只是要解決(ahem)#1。

要計算一個數組元素的地址,你需要知道的三兩件事:

  1. 元素的索引你想
  2. 大小的數組的起始地址陣列元素

我假設你知道如何計算,或者只知道#1 &#3。這就留下了#2,其中涉及簡單的算術。 (既然你沒有說明我是如何表現的,我不能在那裏幫忙太多)。

最後一步是將索引乘以數組元素的大小;這會爲您提供數組開頭的所需元素的偏移量。將它添加到數組開始的地址,並且您有元素的地址。

P.S.您正在翻譯的代碼不會交換兩個元素;它複製一個在另一個之上。

0

這已經有一段時間了,但這可能會接近。如果不嘗試自己,你永遠不會學習彙編語言。製作更多示例並對其進行編碼。更多學習資料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 
+0

.global應該是.globl – Wiz

+0

謝謝。我在這裏使用了例子中的語法:http://www.mips.com/media/files/MD00565-2B-MIPS32-QRC-01.01.pdf也許不同的彙編程序使用不同的關鍵字。 – Gene