河內塔 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。


我覺得學長越來越熱血了 (汗...)
<< 回到主頁