私は MIPS の初心者で、このコードの断片が何を意味するのか理解するのに苦労しています... $s6 は配列 A の始まりです:
addi $t0,$s6,4
これが $t0 = A[4] を意味するかどうかはわかりません - または - $t0 = A[0] + 4 を意味する場合は、A[0] の値を取り、それに 4 を加えて A[ に保存します。 0]
どんな助けでも本当に感謝しています。
前もって感謝します!!
この線:
addi $t0,$s6,4
ここで、$ s6は配列のベースであり、レジスタ$ s6の内容を取得し、それらに4を加算して、結果を$t0に入れます。したがって、$ s6のアドレスが0x00400000の場合、addi命令の後、$t0には0x00400004が含まれます。
addi命令は、即値、つまり整数値をソースレジスタに追加し、その結果をデスティネーションレジスタ(この場合は$ t0)に格納します。
したがって、$s6がA[0]の場合、整数配列があると仮定すると、$t0はA[1]になります。文字配列、つまり文字列がある場合、$t0はA[3]になります。$ t0は、これらの配列インデックスの値を保持しません。これは、$ s6が最初に保持していたものであるため、これらの配列インデックスのアドレスを保持します。
この命令は、$s6 に格納されている値を取得し、それに 4 を加算して、その新しい値を $t0 に格納することを意味します。$s6 の値は変わりません。$s6 は保存された一時レジスタであるため、$s_ の値を変更する必要があるときはいつでも、最初にスタックに保存する必要があります。$s6 の値を変更していないため、スタックに保存する必要はありません。一時レジスタに保存しているので、上書きした内容について心配する必要はありません。また、$s6 は実際には Regester 22 または $R22 であり、$t0 は $r8 です....
基本的に、配列を次の命令/データワードまで1つの32ビットワードずつ増やしています。
これはあなたのコメントへの応答です:
慣例により A[0] = 7 と言うと、レジスタ $s6 の内容によって参照される「メモリ アドレス」が 7 に等しいと言うことになります。s6 は、アドレスであると解釈または認識している数値を保持するだけです。配列の次の要素に到達するのに十分なバイト数を追加したいので、$s6 に 4 を追加します。1 ワードは 32 ビットで 4 バイトです。慣例により、4 を追加する必要があり、次の単語に到達するまでのバイト単位になります。ワードは通常、32 ビットまたは 4 バイトの長さです。4 バイトを s6 に追加した後、s6 が元々何であったかを知らされていないため、結果はわかりませんが、t0 が本質的に s6[1] を指していることはわかっています。配列に別のインデックスを追加しているとは言いません。配列はすでに設定されているか、最後まで読み取れる可能性がありますが、エラーが発生しないことがわかっているため、ミップします。指定したアドレスによって参照されるメイン メモリのスポットに何があるかを示すだけです。blank 、valid、stail、またはプログラム データの別の部分である可能性があります。もっと知るには、プログラムのコンテキストをもっと知る必要があります。
ほとんどのMIPS命令は次のとおりです。
instruction $destination, $operands
この具体的な命令は、$s6に配列A[]の先頭のメモリアドレスを持ち、$t0にA[]の4番目のバイトの位置を格納します。
あなたが書いたことから私が理解しているように、$ s6には、値A [0]ではなく、A[0]のメモリアドレスがあります。
つまり、$ s6 = @A [0]がアドレス値0x00の場合、$ t0 = $ s6+4の値は0x04になります。
配列A[]のタイプ(short、int、long)によっては、これは$t0内の配列の異なる位置を指していることを意味する場合があります。
4バイト長整数の配列の通常の場合、$t0はA[1]を指します。