Changes between Version 4 and Version 5 of Ex03課題2015
- Timestamp:
- Apr 23, 2015 10:49:21 AM (11 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Ex03課題2015
v4 v5 1 1 トップ:http://galaxy.u-aizu.ac.jp/note/wiki/CAEX2015 2 2 3 = 手続き呼び出し:ソート = 4 mainプログラムから手続きを呼び出すプログラムの例を示します。 5 これは、第4版教科書上巻p.137の「2.13 Cプログラムの包括的な例題解説」にある整列アルゴリズムをもとに、 6 本演習で利用可能な命令で構成したソートをするプログラムです。 7 変数Nは要素数を表し、配列Aの先頭から整列される要素が格納されます。 3 = swap手続き = 4 第4版教科書上巻p.137の「2.13 Cプログラムの包括的な例題解説」にあるswap手続き(関数)を 5 本演習で利用可能な命令で実装したプログラムを示します。 6 教科書の該当分をよく読んで、C言語とMIPS命令との対応を理解すること。 7 8 == C言語 == 9 {{{ 10 void swap(int v[], int k) 11 { 12 int temp; 13 temp = v[k]; 14 v[k] = v[k+1]; 15 v[k+1] = temp; 16 } 17 }}} 18 19 == アセンブリプログラム == 20 {{{ 21 swap: addi $t1, $a1, 0 22 add $t1, $t1, $t1 23 add $t1, $t1, $t1 24 add $t1, $a0, $t1 25 lw $t0, 0($t1) 26 lw $t2, 4($t1) 27 sw $t2, 0($t1) 28 sw $t0, 4($t1) 29 jr $ra 30 }}} 8 31 9 32 引数の受け渡しは$a0と$a1のレジスタを使います。 10 ここでは、$a0に整列させる配列の先頭アドレスを、$a1にNをそれぞれセットしてから、ラベルsortから始まる整列アルゴリズムを手続きとして呼び出します。 11 12 {{{ 13 .data 33 ここでは、$a0でswapされる整列させる配列の先頭アドレスを、$a1でswapする箇所の配列の添え字(k)を受け渡します。 34 35 シフト命令は利用できないので、add命令の組み合わせで「k*4」を実現しています。 36 37 == 練習課題 == 38 以下のテンプレートと組み合わせて、swap関数の動作を確認すること。 39 40 {{{ 41 .data 42 k: .word 3 43 A: .word 32 44 .word 422 45 .word 83 46 .word 2 47 .word 92 48 .word 32 49 .word 97 50 .word 22 51 .word 4 52 .word 86 53 54 .text 55 main: la $a0, A 56 lw $a1, k 57 jal swap 58 exit: j exit 59 }}} 60 61 = ソート手続き = 62 教科書に従い、swap関数を使って単純なソートプログラムの動作を確認します。 63 64 {{{ 65 .data 14 66 N: .word 3 15 67 A: .word 32 16 .word 42217 .word 8318 .word 219 .word 9220 .word 3221 .word 9722 .word 2223 .word 424 .word 8625 26 .text27 main: la $a0, A # $a0 = &A28 lw $a1, N # $a1 =N29 jal sort30 exit: j exit68 .word 422 69 .word 83 70 .word 2 71 .word 92 72 .word 32 73 .word 97 74 .word 22 75 .word 4 76 .word 86 77 78 .text 79 main: la $a0, A 80 lw $a1, N 81 jal sort 82 exit: j exit 31 83 32 84 sort: 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, $a040 or $s3, $0, $a1 #move $s3, $a141 42 or $s0,$0,$0# $s0(= i) = 043 44 for1tst: slt $t0,$s0,$s3 # $t0 = (i < N) 1:085 sw $ra, 16($sp) 86 sw $s3, 12($sp) 87 sw $s2, 8($sp) 88 sw $s1, 4($sp) 89 sw $s0, 0($sp) 90 91 or $s2, $0, $a0 #move $s2, $a0 92 or $s3, $0, $a1 #move $s3, $a1 93 94 or $s0,$0,$0 # $s0(= i) = 0 95 96 for1tst: slt $t0,$s0,$s3 # $t0 = (i < N) 1:0 45 97 beq $t0,$0,exit1 # if $t0 == 0 then exit1 46 98 addi $s1, $s0, -1 # j = i - 1 … … 50 102 j exit2 51 103 52 cont: or $t1, $s1, $0 # $t1 = j * 4104 cont: or $t1, $s1, $0 # $t1 = j * 4 53 105 add $t1, $t1, $t1 #変更点3 54 106 add $t1, $t1, $t1 55 107 56 108 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:0109 lw $t3, 0($t2) # $t3 = A[j] 110 lw $t4, 4($t2) # $t4 = A[j+1] 111 112 slt $t0, $t4, $t3 # $t0 = (A[j]< A[j+1]) 1:0 61 113 beq $t0, $0, exit2 # if $t0 == 0 then exit2 62 114 or $a0, $s2, $0 # $a0 = $s2(&A) … … 64 116 jal swap 65 117 66 addi $s1, $s1, -1 # j = j - 1118 addi $s1, $s1, -1 # j = j - 1 67 119 j for2tst 68 120 69 exit2: addi $s0, $s0, 1 # i = i + 1121 exit2: addi $s0, $s0, 1 # i = i + 1 70 122 j for1tst 71 123 … … 77 129 addi $sp, $sp, 20 78 130 jr $ra 79 80 swap: 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 }}} 131 }}} 132 133 sort関数の、引数の受け渡しは$a0と$a1のレジスタを使います。 134 ここでは、$a0に整列させる配列の先頭アドレスを、$a1にNをそれぞれセットしています。 90 135 91 136 教科書のプログラムとの変更点は以下のところです。 92 137 * move命令をor命令に置換 93 138 * bne命令をbeqとj命令の組み合わせに置換 94 * sll命令をadd命令に置換95 139 96 140 $spは明示的に初期化されていませんが、xspimによって自動的に設定されます。 97 141 98 == 練習課題1 ==99 シミュレータで実行し、手続き(関数)呼び出しの実行経過を確認する。100 JAL命令でPCが適切に変更されること、$31に戻り番地が格納されることも確認すること。101 102 142 == 練習課題2 == 103 変数Nが10の場合に正しい結果が得られることを確認すること。 143 swap関数と組み合わせて、N = 3の時に正しく動作することを確認すること。 144 また、変数Nが10の場合に正しい結果が得られることを確認すること。 104 145 105 146 = 課題6:手続きを用いた行列の積アルゴリズム =
