在MIPS程序集中交换数组中的两个元素

时间:2012-06-07 01:53:11

标签: arrays assembly mips

我正在尝试学习MIPS ISA。如果我想在MIPS中执行此功能:

A[2*i]=A[2*k+j];

我该怎么做?我还要感谢我能阅读的任何其他内容,即我可以阅读如何解决此类问题的链接。

2 个答案:

答案 0 :(得分:1)

我们可以将其分解为两部分:

  1. 计算A [2 * i]和A [2 * k + j]
  2. 的地址
  3. 将第二个地址的值分配给第一个地址的内存
  4. 我只会解决(咳)#1。

    要计算数组元素的地址,您需要知道3件事:

    1. 数组开头的地址
    2. 您想要的元素的索引
    3. 数组元素的大小
    4. 我假设您知道如何计算,或者只知道#1& #3。留下了#2,它涉及简单的算术。 (既然你没有说明我是怎样的,j& k的代表,那我就不能帮助太多了。)

      然后,最后一步是将索引乘以数组元素的大小;这为您提供了从数组开始处所需元素的偏移量。将其添加到数组开头的地址,并获得元素的地址。

      P.S。您正在翻译的代码不会交换两个元素;它将一个复制到另一个。

答案 1 :(得分: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