河內塔 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。
我覺得學長越來越熱血了 (汗...)
<< 回到主頁