制御の流れ(分岐命令) 小テスト問題 小テスト問題:制御の流れ(分岐命令) 以下に示すC言語プログラムをMIPSアセンブリ言語に変換せ よ.ただし, 配列Aは100語(1語は32ビット)からなり,その開始アドレス(ベースアドレ ス)はレジスタ$s5に格納されているとする 各変数のレジスタ割当は下表とする バイトアドレスのビッグ・エンディアン方式を前提とする レジスタ$t0~$t7やゼロレジスタ($zero)は自由に使用して良い 変数名 レジスタ if (i >= j) f = g + h; else f = g – h; A[i] = f + f; f $s0 g $s1 h $s2 i $s3 j $s4 A[ ]の先頭アドレス $s5 九州大学工学部電気情報工学科 解答例 i>=j if (i >= j) f = g + h; else f = g – h; A[i] = f + f; Yes No f=g-h A[i] = f + f f=g+h 変数名 レジスタ f $s0 g $s1 h $s2 i $s3 j $s4 A[ ]の先頭アドレス $s5 九州大学工学部電気情報工学科 解答例 slt bne $t0, $s3, $s4 # i<jなら$t0←1,i>=jなら$t0←0 if (i >= j) $t0, $zero, ELSE # $t0≠0ならELSEへ分岐 f = g + h; add j $s0, $s1, $s2 L1 #f=g+h # L1へジャンプ ELSE: sub $s0, $s1, $s2 #f=g–h L1: add add add add sw $t1, $s0, $s0 $t2, $s3, $s3 $t2, $t2, $t2 $t2, $t2, $s5 $t1, 0 ($t2) # # # # # f + f を計算 i×2 i×4 A[i]のアドレス A[i]へ格納 else f = g – h; A[i] = f + f; 変数名 レジスタ f $s0 g $s1 h $s2 i $s3 j $s4 A[ ]の先頭アドレス $s5 九州大学工学部電気情報工学科 解答例 slt bne $t0, $s3, $s4 # i<jなら$t0←1,i>=jなら$t0←0 if (i >= j) $t0, $zero, ELSE # $t0≠0ならELSEへ分岐 f = g + h; add j else f = g – h; A[i] = f + f; $s0, $s1, $s2 #f=g+h L1 # L1へジャンプ 分岐条件の判定 ELSE: 条件不成立ならELSEへ分岐 sub $s0, $s1, $s2 #f=g–h L1: add add add add sw $t1, $s0, $s0 $t2, $s3, $s3 $t2, $t2, $t2 $t2, $t2, $s5 $t1, 0 ($t2) # # # # # f + f を計算 i×2 i×4 A[i]のアドレス A[i]へ格納 変数名 レジスタ f $s0 g $s1 h $s2 i $s3 j $s4 A[ ]の先頭アドレス $s5 九州大学工学部電気情報工学科 解答例 slt bne $t0, $s3, $s4 # i<jなら$t0←1,i>=jなら$t0←0 if (i >= j) $t0, $zero, ELSE # $t0≠0ならELSEへ分岐 f = g + h; add j $s0, $s1, $s2 L1 else f = g – h; A[i] = f + f; #f=g+h # L1へジャンプ ELSE: sub $s0, $s1, $s2 #f=g–h Ifパート(条件成立側)の実行 実行終了後,Elseパートを実行し L1: ないようジャンプ add $t1, $s0, $s0 # f + f を計算 add $t2, $s3, $s3 # i×2 add $t2, $t2, $t2 # i×4 add $t2, $t2, $s5 # A[i]のアドレス sw $t1, 0 ($t2) # A[i]へ格納 変数名 レジスタ f $s0 g $s1 h $s2 i $s3 j $s4 A[ ]の先頭アドレス $s5 九州大学工学部電気情報工学科 解答例 slt bne $t0, $s3, $s4 # i<jなら$t0←1,i>=jなら$t0←0 if (i >= j) $t0, $zero, ELSE # $t0≠0ならELSEへ分岐 f = g + h; add j $s0, $s1, $s2 L1 #f=g+h # L1へジャンプ ELSE: sub $s0, $s1, $s2 #f=g–h else f = g – h; A[i] = f + f; 変数名 レジスタ f $s0 L1: g add $t1, $s0, $s0 # f + f を計算 h add $t2, $s3, $s3 # i×2 Elseパート(条件不成立側)の実行 add $t2, $t2, $t2 # i×4 i ラベルL1以降はIf文の条件に関係なく add $t2, $t2, $s5 # A[i]のアドレス j 必ず実行されるため,Ifパートにある最 sw $t1, 0 ($t2) # A[i]へ格納 後のジャンプ命令は不要 A[ ]の先頭アドレス $s1 $s2 $s3 $s4 $s5 九州大学工学部電気情報工学科 解答例 slt $t0, $s3, $s4 # i<jなら$t0←1,i>=jなら$t0←0 if (i >= j) = f +ELSE f の実行 bne $t0,A[i] $zero, # $t0≠0ならELSEへ分岐 f = g + h; f + f を計算し,$t1へ格納 else iを4倍にしてA[i]へのオフセットを得る add $s0, $s1, $s2 #f=g+h f = g – h; j (バイトアドレスである事に注意) L1 # L1へジャンプ A[ ]の先頭アドレスとオフセットを加え A[i] = f + f; てA[i]のアドレスを求め$t2に格納 ELSE: $t1の値(つまりf + f)をメモリにストア 変数名 レジスタ sub $s0, $s1, $s2 #f=g–h L1: add add add add sw $t1, $s0, $s0 $t2, $s3, $s3 $t2, $t2, $t2 $t2, $t2, $s5 $t1, 0 ($t2) # # # # # f + f を計算 i×2 i×4 A[i]のアドレス A[i]へ格納 f $s0 g $s1 h $s2 i $s3 j $s4 A[ ]の先頭アドレス $s5 九州大学工学部電気情報工学科 Created by Koji Inoue, 2005 (R1.00) 九州大学工学部電気情報工学科
© Copyright 2025 ExpyDoc