←第2回のヒント | ↑目次 | →課題4.1,4.2のヒント

情報科学実験II コンパイラ作成

第3回

課題3.2の結果をMarsで確認するには

以下、Marsの入出力を用いずに、レジスタとデータを直接確認する場合には、背景がついた部分は不要である。
出力されたコードの前に以下のコードを加える
        la $fp, FRM
後ろに以下のコードを加える
    # 実行後の変数の値を入出力ウィンドウに表示
        la $t0, VARn
        lw $a0, 0($t0)
        li $v0, 1
        syscall
        li $a0, 0x0a
        li $v0, 11
        syscall
        la $t0, VARm
        lw $a0, 0($t0)
        li $v0, 1
        syscall
        li $a0, 0x0a
        li $v0, 11
        syscall
        la $t0, PARAMk
        lw $a0, 0($t0)
        li $v0, 1
        syscall
        li $a0, 0x0a
        li $v0, 11
        syscall
    # 実行を終了する
        li $v0, 10
        syscall
        .data
VARn:   .word 1
VARm:   .word 2
FRM:    .word 0
        .word 0
PARAMk: .word 4
上の例で、最後の5行のwordの後ろの数は適宜変更してもよい。Marsで実行させれば、n, m, kの値が順に出力される。なお、課題3.2の実行には、関数fib, 引数k, 局所変数n, mに対するSymEntryを定義しておいて、n=m+kに対応するExprNodeを作って実行すればそれで十分である。

課題3.3の結果をMarsで確認するには

関数fib(noを3, nParam=1とする)と変数k(noが1である大域変数またはfibの引数)のSymEntryを作り、fib(k-2)のExprNodeに対するコードを出力する。fib関数本体のコードは不要。出力されたコードの前に以下のコードを加える
        la $fp, FRM
後ろに以下のコードを加える
    # 実行後のスタックに積まれた値を入出力ウィンドウに表示
        lw $a0, 0($sp)
        li $v0, 1
        syscall
        li $a0, 0x0a
        li $v0, 11
        syscall
        li $v0, 10
        syscall
F0003:
fib:
        lw $t0, 0($sp)
        li $v0, 1
        li $v1, 0
fib1:
        move $t1, $v0
        add $v0, $v0, $v1
        move $v1, $t1
        addi $t0, $t0, -1
        blt $zero, $t0, fib1
        sw $v0, 4($sp)
        jr $ra

        .data
G0001:  .word 10   # 大域変数kの値
VARn:   .word 4
VARm:   .word 2
FRM:    .word 0
        .word 0
PARAMk: .word 10   # 引数kの値
Marsで実行させると、10-2に対するフィボナッチ数である34が表示されるはず。
トップページ