2012-06-07 61 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