Changes between Initial Version and Version 1 of Ex03課題2015


Ignore:
Timestamp:
Apr 21, 2015 9:10:43 PM (11 years ago)
Author:
nakasato
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Ex03課題2015

    v1 v1  
     1'''作成中''' 
     2 
     3= 手続き呼び出し:ソート = 
     4mainプログラムから手続きを呼び出すプログラムの例を示します。 
     5これは、第4版教科書上巻p.137の「2.13 Cプログラムの包括的な例題解説」にある整列アルゴリズムをもとに、 
     6本演習で利用可能な命令で構成したソートをするプログラムです。 
     7変数Nは要素数を表し、配列Aの先頭から整列される要素が格納されます。 
     8 
     9引数の受け渡しは$a0と$a1のレジスタを使います。 
     10ここでは、$a0に整列させる配列の先頭アドレスを、$a1にNをそれぞれセットしてから、ラベルsortから始まる整列アルゴリズムを手続きとして呼び出します。 
     11 
     12{{{ 
     13        .data  
     14N:     .word 3  
     15A:     .word 32  
     16        .word 422  
     17        .word 83  
     18        .word 2  
     19        .word 92  
     20        .word 32  
     21        .word 97  
     22        .word 22  
     23        .word 4  
     24        .word 86  
     25 
     26        .text  
     27main:  la $a0, A           # $a0 = &A  
     28          lw $a1, N           # $a1 = N  
     29          jal sort  
     30exit:    j exit  
     31 
     32sort:  addi $sp, $sp, -20  
     33         sw $ra, 16($sp)  
     34         sw $s3, 12($sp)  
     35         sw $s2, 8($sp)  
     36         sw $s1, 4($sp)  
     37         sw $s0, 0($sp)  
     38 
     39         or $s2, $0, $a0     #move $s2, $a0  
     40         or $s3, $0, $a1     #move $s3, $a1  
     41 
     42         or $s0,$0,$0         # $s0(= i) = 0  
     43 
     44for1tst: slt $t0,$s0,$s3   # $t0 = (i < N) 1:0  
     45         beq $t0,$0,exit1    # if $t0 == 0 then exit1  
     46         addi $s1, $s0, -1   # j = i - 1  
     47 
     48for2tst: slti $t0, $s1, 0    # $t0 = (j < 0) 1:0  
     49         beq $t0, $0, cont   #bne $t0, $0, exit2 変更点2  
     50         j exit2  
     51 
     52cont:    or $t1, $s1, $0   # $t1 = j * 4  
     53         add $t1, $t1, $t1   #変更点3  
     54         add $t1, $t1, $t1  
     55 
     56         add $t2, $s2, $t1   # $t2 = &(A[j])  
     57         lw $t3, 0($t2)         # $t3 = A[j]  
     58         lw $t4, 4($t2)         # $t4 = A[j+1]  
     59 
     60         slt $t0, $t4, $t3      # $t0 = (A[j]< A[j+1]) 1:0  
     61         beq $t0, $0, exit2  # if $t0 == 0 then exit2  
     62         or $a0, $s2, $0     # $a0 = $s2(&A)  
     63         or $a1, $s1, $0     # $a1 = $s1(j)  
     64         jal swap  
     65 
     66         addi $s1, $s1, -1 # j = j - 1  
     67         j for2tst  
     68 
     69exit2:   addi $s0, $s0, 1 # i = i + 1  
     70         j for1tst  
     71 
     72exit1:   lw $s0, 0($sp)  
     73         lw $s1, 4($sp)  
     74         lw $s2, 8($sp)  
     75         lw $s3, 12($sp)  
     76         lw $ra, 16($sp)  
     77         addi $sp, $sp, 20  
     78         jr $ra  
     79 
     80swap:    addi $t1, $a1, 0  
     81         add $t1, $t1, $t1    #変更点3  
     82         add $t1, $t1, $t1  
     83         add $t1, $a0, $t1  
     84         lw $t0, 0($t1)  
     85         lw $t2, 4($t1)  
     86         sw $t2, 0($t1)  
     87         sw $t0, 4($t1)  
     88         jr $31 
     89}}} 
     90 
     91教科書のプログラムとの変更点は以下のところです。 
     92 * move命令をor命令に置換 
     93 * bne命令をbeqとj命令の組み合わせに置換 
     94 * sll命令をadd命令に置換 
     95 
     96$spは明示的に初期化されていませんが、xspimによって自動的に設定されます。 
     97 
     98== 練習課題1 == 
     99シミュレータで実行し、手続き(関数)呼び出しの実行経過を確認する。 
     100JAL命令でPCが適切に変更されること、$31に戻り番地が格納されることも確認すること。 
     101 
     102== 練習課題2 == 
     103 
     104= 課題6:手続きを用いた行列の積アルゴリズム =  
     105第2回演習で作成した、行列の積を求めるプログラムのうち、二つの整数の積を求める部分を、手続きに置き換えなさい。 
     106 # 手続きのラベルは「MUL」にする。 
     107 # 引数は$a0と$a1を介して引き渡す。 
     108 # この手続きでは結果は$v0に保持する。 
     109 # メインプログラムでは、計算結果$v0を使って行列積をけいさんする。 
     110 
     111実行経過を確認し、実行結果が依然と同じことを確認してください。 
     112 
     113= スタックを利用した手続き呼び出し =  
     114第4版教科書上巻p.105にある階乗を計算する再帰的手続きをもとに、スタックレジスタ($sp)の使いかたを理解します。 
     115メインプログラムは、ラベルmainからはじまり、$a0にNをセットして手続きfactを呼び出します。 
     116Nは要素数を指定し、結果はFNに格納します。 
     117 
     118この手続きは自分自身を呼び出すので、$a0と$raレジスタをスタックに保持する必要があります。 
     119 
     120{{{ 
     121        .data  
     122N:      .word 5  
     123FN:     .word 0  
     124 
     125.text  
     126main:   lw $a0, N         # $a0(= N) = 10  
     127        jal fact          # $v0 = fact($a0)  
     128        sw $v0 FN         # FN = $v0  
     129        exit: j exit  
     130 
     131fact:   addi $sp, $sp, -8  
     132        sw $ra, 4($sp)  
     133        sw $a0, 0($sp)  
     134 
     135        slti $t0, $a0,1   # $t1 = ($a0 < 1) 1:0  
     136        beq $t0, $0, L1   # if $t1 = 0 then L1  
     137 
     138        addi $v0,$0,1     # $v0 = 1  
     139        addi $sp,$sp,8    # $sp = $sp + 8  
     140        jr $ra            # return FN = 1  
     141 
     142L1:     addi $a0,$a0,-1  
     143        jal fact          # fact($a0 - 1)  
     144        lw $a0, 0($sp)  
     145        lw $ra, 4($sp)  
     146        addi $sp,$sp,8  
     147        mul $v0,$a0,$v0  
     148        jr $ra 
     149}}} 
     150