0

MIPS ISA を学習しようとしています。この機能を MIPS で実行したい場合:

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

これについてどうすればいいですか?また、私が読むことができる他のコンテンツ、つまり、この種の問題を解決する方法について読むことができるリンクをいただければ幸いです。

4

2 に答える 2

1

これを 2 つの部分に分けることができます。

  1. A[2*i] と A[2*k+j] のアドレスを計算する
  2. 2 番目のアドレスの値を 1 番目のアドレスのメモリに割り当てます

私は(エヘム)#1にのみ対処するつもりです。

配列要素のアドレスを計算するには、次の 3 つのことを知っておく必要があります。

  1. 配列の開始アドレス
  2. 必要な要素のインデックス
  3. 配列要素のサイズ

#1 と #3 の計算方法を知っているか、単に知っているだけだと思います。これで、単純な算術演算を含む #2 が残ります。(i、j、kがどのように表されているかを示していないので、あまり役に立ちません)。

最後のステップは、インデックスに配列要素のサイズを掛けることです。これにより、配列の先頭からの目的の要素のオフセットが得られます。それを配列の開始アドレスに追加すると、要素のアドレスが得られます。

PS 翻訳しているコードは 2 つの要素を交換しません。それは一方を他方にコピーします。

于 2012-06-07T02:25:49.027 に答える
0

しばらく経ちましたが、これは近いかもしれません。アセンブリ言語は、自分で試してみることなしに習得することはできません。より多くの例を作成し、それらをコーディングします。その他の学習資料はこちら.

# 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 
于 2012-06-07T02:56:52.440 に答える