Changes between Version 5 and Version 6 of Ex01 MIPSプログラミングの基礎2017


Ignore:
Timestamp:
Apr 17, 2017 5:10:08 PM (9 years ago)
Author:
nakasato
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Ex01 MIPSプログラミングの基礎2017

    v5 v6  
    139139if文の条件判定の式が複雑な場合も同様に分解します。 
    140140 
    141 アセンブリプログラムでは、一時的な変数の役割はレジスタがいます。 
     141アセンブリプログラムでは、一時的な変数の役割はレジスタがいます。 
    142142しかし、すべての一時的なレジスタを使いきるような場合、一時変数を保持するのにメモリを利用する必要があります。 
    143143メモリを利用する場合、swおよびlw命令が必要となり、 
     
    167167 
    168168配列のように連続するデータのアドレスが規則的に並んでいる場合、 
    169 レジスタを使ってアドレスを加算しながらメモリにアクセスするとプログラムが簡単に記述できます。 
     169レジスタを使ってアドレスを加算しながらメモリにアクセスするとプログラムが簡単に記述できます。 
    170170たとえば次のようにデータが並んでいるとします。   
    171171  
     
    175175||A+8 || 10 || 
    176176||A+12 || 15 || 
    177 ||S ||  結果の格納 || 
     177||S ||  結果の格納場所 || 
    178178 
    179179このような場合、最初のアドレスAがわかれば、次のアドレスはAに4を足すことによって求めることができます。 
    180 したがって、つの要素の和を求める場合、次のようなプログラムを記述すればよいことになります。  
     180したがって、4つの要素の和を求める場合、次のようなプログラムを記述すればよいことになります。  
    181181   
    182182{{{ 
     
    188188S:      .word 0 
    189189        .text  
    190 main:   or   $8, $0, $0   # 和を 0 に初期化  
    191         la   $9, A        # Aのアドレスを $9 に入れる。実際は ori 命令に置き換わる。 
     190main:   or   $8, $0, $0   # 和($8レジスタ)を 0 に初期化  
     191        la   $9, A        # la命令によりAのアドレスを $9 に入れる。実際は ori 命令に置き換わる。 
    192192 
    193193        lw   $10, 0($9)  
     
    241241 
    242242上の2番目のプログラムをエディタにコピー&ペーストして、xspimで動作を確認してください。 
    243 レジスタをインクリメントしながらメモリにアクセスする方法を理解してください。  
     243レジスタを使って配列アドレスををインクリメントしながらメモリにアクセスする方法を理解してください。  
    244244 
    245245= 条件分岐 = 
    246 本演習で利用可能な命令の中で、条件分岐に利用できるのはbranch on equal命令だけです。 
     246本演習で利用可能な命令の中で、条件分岐に利用できるのはbranch on equal命令(比較結果が等しい場合に指定したアドレスにジャンプする)だけです。 
    247247例えば、C言語での以下の条件分岐は 
    248248 
     
    278278beq $8,$0,label1 
    279279 
    280 サブプログラム1に対応するアセンブラプログラム 
     280サブプログラム1に対応する部分 
    281281 
    282282goto label2 
    283283label1: 
    284284 
    285 サブプログラム2に対応するアセンブラプログラム 
     285サブプログラム2に対応する部分 
    286286 
    287287label2: 
     
    297297}}} 
    298298 
    299 === MIPSアセンブリ === 
     299=== 疑似的なアセンブリプログラム === 
    300300{{{ 
    301301label1: 
     
    303303beq $a,$0,label2 
    304304 
    305 サブプログラムに対応するアセンブラプログラム 
     305サブプログラムに対応する部分 
    306306 
    307307goto label1 
    308308}}} 
     309 
    309310なお、条件が等式の場合は$aを用いず、直接beq命令で等式判定をします。 
    310311 
     
    349350総和演算のような処理は処理はwhile文を用いることによって記述できます。 
    350351 
    351 === MIPSアセンブリ === 
     352=== MIPSアセンブリプログラム === 
    352353アセンブリプログラムでは、分岐命令と比較命令を用いてループを実現します。 
    353354メモリの初期状態を以下のように仮定します。  
     
    430431      .word 56    # A[8] = 56  
    431432      .word 32    # A[9] = 32  
    432 B:    .space 40   # 配列B の格納先 大きさは40バイト 
     433B:    .space 40   # 配列B の格納先を確保する。大きさは40バイト(10ワード分) 
    433434      .text  
    434435main: