我正在尝试学习 MIPS ISA。如果我想在 MIPS 中执行此功能:
A[2*i]=A[2*k+j];
我该怎么办?我也很感激我可以阅读的任何其他内容,即我可以阅读有关如何解决此类问题的链接。
我们可以将其分解为 2 个部分:
我只想解决(咳咳)#1。
要计算数组元素的地址,你需要知道 3 件事:
我假设你知道如何计算,或者只是知道,#1 & #3。剩下的#2,它涉及简单的算术。(由于您没有说明 i、j 和 k 的表示方式,因此我无法提供太多帮助)。
最后一步是将索引乘以数组元素的大小;这为您提供了所需元素相对于数组开头的偏移量。将其添加到数组开头的地址,您就有了元素的地址。
PS您正在翻译的代码不会交换两个元素;它一个接一个地复制。
已经有一段时间了,但这可能很接近。不亲自尝试,你永远学不会汇编语言。制作更多示例并对其进行编码。更多学习材料在这里。
# 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