1
            .text
      main:  la    $a0, A #loads address of A into $a0
             li    $t0, 1 #loads 1 into $t0
             sw    $t0, ($a0) #stores word from $a0 into $t0
             li    $t0, 2 #loads 2 into $t0
             sw    $t0, 4($a0)
             li    $t0, 3
             sw    $t0, 8($a0)
             li    $t0, 4
             sw    $t0, 12($a0)

             la    $a1, A
             li    $v0, 1
             lw    $a0, ($a1)
             syscall
             lw    $a0, 4($a1)
             syscall
             lw    $a0, 8($a1)
             syscall
             lw    $a0, 12($a1)
             syscall
             la    $a0, tab
             li    $v0, 4
             syscall      
             li    $v0, 10
             syscall    

            .data
         A: .space 16 #array size 16
       tab: .asciiz "\t" #makes line indentation
#stores 1 - 4 into $t0

私が見ることができることから、Aのアドレスをa0にロードし、「1」を$ t0にロードしてからオーバーライドしますか?!? $t0、配列を格納することにより、次に 2 を $t0 にロードします。次に、4 が何をすべきかわかりません (私が見る限り、何もしません。次に、$t0 を 3 にロードします。次に '4' と同じ 8 が何をするかわからない 4 を $t0 にロードし、12 で何かを実行し、A のアドレスを $a1 にロードして、それを出力します?!? I' m はプログラムの残りの部分について完全に迷っています. プログラムは正しいです (loads "1234") が, クラスの講師が与える各プログラムを理解することによって MIPS を学ぶことになっています. これは宿題でも何でもなく, ただ学ぶだけです. MIPS プログラムがどのように機能するか。

4

2 に答える 2

2

このプログラムは、最初に定数 1、2、3、4 を A のアドレスから格納し、次にこれら 4 つのワードの内容を出力します。

命令sw reg1, offset(reg2)は、レジスタ reg1 の内容を、指定されたオプションのオフセットを加えた reg2 が指すアドレスに格納します。

したがって、最初の例でsw $t0, ($a0)は、 $t0 の内容を $a0 が指すアドレス (この場合はラベル A のアドレス) に格納します。

次に、単語を格納していて、各単語が正確に 4 バイトを占有するため、オフセットとして 4 の倍数を使用します。したがって、連続する単語に 1、2、3、4 の数値を格納するには、前の各アドレスに 4 を追加する必要があります。

于 2012-04-19T16:50:28.063 に答える
1

展開されたループのようです。最初のループは配列の内容を設定し、2 番目のループは配列の内容を出力し、その後にタブを表示します。擬似コードは次のようになります。

function main()
{
  i = 1
  while( i <= 4 )
  {
    A[i-1] = i
    i = i + 1
  }

  i = 1
  while( i <= 4 )
  {
    printToConsole( A[i-1] )
    i = i + 1
  }
  printToConsole( tab )
}

コードがアセンブルされたとき、アセンブラはパフォーマンスの向上としてループをアンロールした可能性があります。

于 2012-04-19T16:01:13.173 に答える