【问题标题】:Swapping two elements in an array in MIPS assembly在 MIPS 程序集中交换数组中的两个元素
【发布时间】:2012-06-07 01:53:11
【问题描述】:

我正在尝试学习 MIPS ISA。如果我想在 MIPS 中做这个功能:

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

我该怎么做呢?我也很感激我可以阅读的任何其他内容,即我可以阅读有关如何解决此类问题的链接。

【问题讨论】:

    标签: arrays assembly mips


    【解决方案1】:

    我们可以把它分成两部分:

    1. 计算A[2*i]和A[2*k+j]的地址
    2. 将第二个地址的值赋给第一个地址的内存

    我只想解决(咳咳)#1。

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

    1. 数组的起始地址
    2. 你想要的元素的索引
    3. 数组元素的大小

    我假设您知道如何计算,或者只知道 #1 和 #3。剩下的#2,它涉及简单的算术。 (由于您没有说明 i、j 和 k 是如何表示的,我对此无能为力)。

    最后一步是将索引乘以数组元素的大小;这为您提供了所需元素相对于数组开头的偏移量。将其添加到数组开头的地址,您就有了元素的地址。

    附:您正在翻译的代码不会交换两个元素;它会一个接一个地复制。

    【讨论】:

      【解决方案2】:

      已经有一段时间了,但这可能很接近。不亲自尝试,你永远学不会汇编语言。制作更多示例并对其进行编码。更多学习资料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 
      

      【讨论】:

      • 谢谢。我在这里的示例中使用了语法:mips.com/media/files/MD00565-2B-MIPS32-QRC-01.01.pdf 也许不同的汇编器使用不同的关键字。
      • 你会得到更好的 ILP 与计算 (k<<3) + (j<<2) 的相同指令组合,而不是 ((k<<1) + j) << 2。但是,如果您有一个一次只能运行一个班次的超标量 MIPS,您可以/应该将 sll 替换为 1 为 addu dst, same,same。 (add 不适用于地址;如果A[] 恰好跨越有符号正负 32 位地址空间之间的 2GB 边界,您不希望捕获。)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      相关资源
      最近更新 更多