MIPS ISA を学習しようとしています。この機能を MIPS で実行したい場合:
A[2*i]=A[2*k+j];
これについてどうすればいいですか?また、私が読むことができる他のコンテンツ、つまり、この種の問題を解決する方法について読むことができるリンクをいただければ幸いです。
これを 2 つの部分に分けることができます。
私は(エヘム)#1にのみ対処するつもりです。
配列要素のアドレスを計算するには、次の 3 つのことを知っておく必要があります。
#1 と #3 の計算方法を知っているか、単に知っているだけだと思います。これで、単純な算術演算を含む #2 が残ります。(i、j、kがどのように表されているかを示していないので、あまり役に立ちません)。
最後のステップは、インデックスに配列要素のサイズを掛けることです。これにより、配列の先頭からの目的の要素のオフセットが得られます。それを配列の開始アドレスに追加すると、要素のアドレスが得られます。
PS 翻訳しているコードは 2 つの要素を交換しません。それは一方を他方にコピーします。
しばらく経ちましたが、これは近いかもしれません。アセンブリ言語は、自分で試してみることなしに習得することはできません。より多くの例を作成し、それらをコーディングします。その他の学習資料はこちら.
# 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