cpuex2021-1 / compiler

0 stars 0 forks source link

変数のSave #3

Open ataga101 opened 2 years ago

ataga101 commented 2 years ago

fibでデバッグしていたんだけど、変数がSaveできてなさそうです。 というのも、

    jump min_caml_start
print_int:
    lw s0, 0(zero)
    jalr zero, ra, 0 # ret
fib.10:
    addi a1, zero, 1
    blt a1, a0, ble_else.24
    jalr zero, ra, 0 # ret
ble_else.24:
    addi a1, zero, 1
    sub a1, a0, a1
    sw a0, 0(sp)  # <- ココ!
    add a0, a1, zero
    sw ra, -2(sp)
    addi sp, sp, -2
    jal ra, fib.10 # call
    addi sp, sp, 2
    lw ra, -2(sp)
    addi a1, zero, 2
    lw a2, 0(sp)
    sub a1, a2, a1
    sw a0, 1(sp)
    add a0, a1, zero
    sw ra, -4(sp)
    addi sp, sp, -4
    jal ra, fib.10 # call
    addi sp, sp, 4
    lw ra, -4(sp)
    lw a1, 1(sp)
    add a0, a1, a0
    jalr zero, ra, 0 # ret
min_caml_start:
    addi sp, sp, -28
    addi a0, zero, 30
    sw ra, -2(sp)
    addi sp, sp, -2
    jal ra, fib.10 # call
    addi sp, sp, 2
    lw ra, -2(sp)
    sw ra, -2(sp)
    addi sp, sp, -2
    jal ra, print_int # call
    addi sp, sp, 2
    lw ra, -2(sp)
    jalr zero, ra, 0 # ret

ココ!って書いてあるところで、どうやら一個前の関数呼び出しの時にスタックに積んだraを書き換えてしまっているようです。

81ueman commented 2 years ago
    jump min_caml_start
print_int:
    sw a0, 0(zero)
    jalr zero, ra, 0 # ret
fib.10:
    addi a1, zero, 1
    blt a1, a0, ble_else.24
    jalr zero, ra, 0 # ret
ble_else.24:
    addi a1, zero, 1
    sub a1, a0, a1
    sw a0, 0(sp)
    add a0, a1, zero
    sw ra, -2(sp)
    addi sp, sp, -3
    jal ra, fib.10 # call
    addi sp, sp, 3
    lw ra, -2(sp)
    addi a1, zero, 2
    lw a2, 0(sp)
    sub a1, a2, a1
    sw a0, 1(sp) ←ココ!
    add a0, a1, zero
    sw ra, -2(sp)
    addi sp, sp, -3
    jal ra, fib.10 # call
    addi sp, sp, 3
    lw ra, -2(sp)
    lw a1, 1(sp) ←ココ!
    add a0, a1, a0
    jalr zero, ra, 0 # ret
min_caml_start:
    addi sp, sp, -28
    addi a0, zero, 30
    sw ra, 0(sp)
    addi sp, sp, -1
    jal ra, fib.10 # call
    addi sp, sp, 1
    lw ra, 0(sp)
    sw ra, 0(sp)
    addi sp, sp, -1
    jal ra, print_int # call
    addi sp, sp, 1
    lw ra, 0(sp)
    jalr zero, ra, 0 # ret

最新版のだと今度は上のココ!って部分でraを書き換えちゃってるので変数保存する時のオフセットがおかしいっぽい。

spを関数呼び出しするときに-3してるのが少し不思議だったんですけどsw a0 1(sp)sw a0 -1(sp)にしたらちゃんと動いたしspを-3してるのも辻褄合うのでなんか符号間違えてる感じですかね