Changes between Version 9 and Version 10 of Ex01 MIPSアセンブリの基礎2015


Ignore:
Timestamp:
Apr 12, 2015 11:38:13 AM (11 years ago)
Author:
nakasato
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Ex01 MIPSアセンブリの基礎2015

    v9 v10  
    153153||S ||  結果の格納 || 
    154154 
     155  
     156= 例題2 レジスタによるメモリの参照 = 
     157この例題ではメモリを間接的に参照するためにレジスタ相対アドレスを用いる方法を示します。 
     158以下のような配列変数の和を計算することを考えます。 
     159{{{ 
     160S=A[0]+A[1]+A[2]+A[3] 
     161}}} 
     162 
     163配列のように、連続するデータのアドレスが規則的に並んでいる場合、 
     164レジスタを使ってアドレスを加減算しながらメモリにアクセスするとプログラムが簡単に記述できます。 
     165たとえば次のようにデータが並んでいるとします。   
     166  
     167||アドレス    ||データ(10進数) || 
     168||A      || 19 || 
     169||A+4 || 75 || 
     170||A+8 || 10 || 
     171||A+12 || 15 | 
     172||S ||  結果の格納 || 
     173 
     174このような場合、最初のアドレスAがわかれば、次のアドレスはAに4を足すことによって求めることができます。 
     175したがって、4つの要素の和を求める場合、次のようなプログラムを記述すればよいことになります。  
    155176   
    156  
     177{{{ 
     178        .data  
     179A:      .word 19  
     180        .word 75  
     181        .word 10  
     182        .word 15  
     183S:      .word 0 
     184        .text  
     185main:   or   $8, $0, $0   # 和を 0 に初期化  
     186        la   $9, A        # Aのアドレスを $9 に入れる。実際は ori 命令に置き換わる。 
     187 
     188        lw   $10, 0($9)  
     189        add  $8, $8, $10  
     190 
     191        lw   $10, 4($9)  
     192        add  $8, $8, $10 
     193 
     194        lw   $10, 8($9)  
     195        add  $8, $8, $10 
     196 
     197        lw   $10, 12($9)  
     198        add  $8, $8, $10 
     199 
     200        sw   $8, S  
     201exit:   j exit 
     202}}}  
     203 
     204また、上のプログラムは下のように書き直すこともできます。 
     205この形は各データに対する処理が全く同じ命令列になるため、 
     206後で述べるループを用いて和を求める場合に適しています。  
     207 
     208{{{ 
     209        .data  
     210A:      .word 19  
     211        .word 75  
     212        .word 10  
     213        .word 15  
     214S:      .word 0 
     215        .text  
     216main:   or   $8, $0, $0   # 和を 0 に初期化  
     217        la   $9, A        # Aのアドレスを $9 に入れる。実際は ori 命令に置き換わる。 
     218 
     219        lw   $10, 0($9)  
     220        add  $8, $8, $10   
     221        addi $9, $9, 4    # アドレスを次へすすめる 
     222 
     223        lw   $10, 0($9)  
     224        add  $8, $8, $10  
     225        addi $9, $9, 4 
     226 
     227        lw   $10, 0($9)  
     228        add  $8, $8, $10  
     229        addi $9, $9, 4 
     230 
     231        lw   $10, 0($9)  
     232        add  $8, $8, $10 
     233 
     234        sw   $8, S  
     235exit:   j exit 
     236}}}