2006/12/15

河內塔 in TOY86

加上 memory operand 之後,程式碼長度和複雜度變得較為合理:

PROC hanoi
; parameters
; [RB + 2]   number of disks
; [RB + 3]   source peg
; [RB + 4]   intermediate peg
; [RB + 5]   destination peg

        ; base case
        bz   [RB + 2], end

        ; first recursive call
        push [RB + 4]
        push [RB + 5]
        push [RB + 3]
        ldi  RD, RB + 2
        sub  RD, RD, 1
        push RD
        call hanoi
        sub  RE, RB, 1

        ; output
        ldi  RD, RB + 3
        shl  RD, RD, 4
        add  RD, RD, [RB + 5]
        st   RD, 0xFF

        ; second recursive call
        push [RB + 5]
        push [RB + 3]
        push [RB + 4]
        ldi  RD, RB + 2
        sub  RD, RD, 1
        push RD
        call hanoi

end     ret
ENDPROC

push 2
push 1
push 0
ld   RD, 0xFF
push RD
call hanoi

這次在做人工組譯時,也做了一點最佳化,最後的機械碼比 JK-extended 版(未最佳化)組譯出來的少 7 行。統計一下,"lda RF, 1" 這個指令出現了 14 次(push 時移動 stack pointer 所需),可以考慮多個組譯器選項 "lda1 optimization",讓程式員指定一個 register 專門放 1(然後這個 register 在整個程式中變為不可存取),對於這個程式至少可以省下 14 個指令。

--
Classical 版和機械碼我就不貼了 XD。

Labels: ,

Blogger Fall12/17/2006 12:20 am 說:

我覺得學長越來越熱血了 (汗...)

 

<< 回到主頁