河內塔 in TOY Assembly
首先是 JK-extended 版:
PROC hanoi
; parameters
; [RB + 2] number of disks
; [RB + 3] source peg
; [RB + 4] intermediate peg
; [RB + 5] destination peg
; base case
ldi RD, RB + 2
bz RD, end
; first recursive call
ldi RD, RB + 4
push RD
ldi RD, RB + 5
push RD
ldi RD, RB + 3
push RD
ldi RD, RB + 2
sub RD, RD, RF
push RD
call hanoi
sub RE, RB, RF
; output
ldi RD, RB + 3
shl RD, RD, 4
ldi RC, RB + 5
add RD, RD, RC
st RD, 0xFF
; second recursive call
ldi RD, RB + 5
push RD
ldi RD, RB + 3
push RD
ldi RD, RB + 4
push RD
ldi RD, RB + 2
sub RD, RD, RF
push RD
call hanoi
end ret
ENDPROC
lda RC, 2
push RC
lda RC, 1
push RC
lda RC, 0
push RC
ld RC, 0xFF
push RC
call hanoi
add RE, RE, 4
人工轉譯為 classical 版:
lda RE, 0xFE ; initialization
lda RF, 1
lda RC, 2
sti RC, RE ; push RC
sub RE, RE, RF
lda RC, 1
sti RC, RE ; push RC
sub RE, RE, RF
lda RC, 0
sti RC, RE ; push RC
sub RE, RE, RF
ld RC, 0xFF
sti RC, RE ; push RC
sub RE, RE, RF
jl RF, hanoi ; call hanoi
lda RF, 1 ; redundant
lda RF, 4 ; add RE, RE, 4
add RE, RE, RF
lda RF, 1 ; redundant
hlt
hanoi sti RF, RE ; PROC
lda RF, 1
sub RE, RE, RF
sti RB, RE
add RB, RE, R0
sub RE, RE, RF
lda RF, 2 ; ldi RD, RB + 2
add RF, RB, RF
ldi RD, RF
lda RF, 1 ; redundant
bz RD, end
lda RF, 4 ; ldi RD, RB + 4
add RF, RB, RF
ldi RD, RF
lda RF, 1
sti RD, RE ; push RD
sub RE, RE, RF
lda RF, 5 ; ldi RD, RB + 5
add RF, RB, RF
ldi RD, RF
lda RF, 1
sti RD, RE ; push RD
sub RE, RE, RF
lda RF, 3 ; ldi RD, RB + 3
add RF, RB, RF
ldi RD, RF
lda RF, 1
sti RD, RE ; push RD
sub RE, RE, RF
lda RF, 2 ; ldi RD, RB + 2
add RF, RB, RF
ldi RD, RF
lda RF, 1
sub RD, RD, RF
sti RD, RE ; push RD
sub RE, RE, RF
jl RF, hanoi ; call hanoi
lda RF, 1
sub RE, RB, RF
lda RF, 3 ; ldi RD, RB + 3
add RF, RB, RF
ldi RD, RF
lda RF, 1 ; redundant
lda RF, 4
shl RD, RD, RF
lda RF, 1 ; redundant
lda RF, 5 ; ldi RC, RB + 5
add RF, RB, RF
ldi RC, RF
lda RF, 1 ; redundant
add RD, RD, RC
st RD, 0xFF
lda RF, 5 ; ldi RD, RB + 5
add RF, RB, RF
ldi RD, RF
lda RF, 1
sti RD, RE ; push RD
sub RE, RE, RF
lda RF, 3 ; ldi RD, RB + 3
add RF, RB, RF
ldi RD, RF
lda RF, 1
sti RD, RE ; push RD
sub RE, RE, RF
lda RF, 4 ; ldi RD, RB + 4
add RF, RB, RF
ldi RD, RF
lda RF, 1
sti RD, RE ; push RD
sub RE, RE, RF
lda RF, 2 ; ldi RD, RB + 2
add RF, RB, RF
ldi RD, RF
lda RF, 1
sub RD, RD, RF
sti RD, RE ; push RD
sub RE, RE, RF
jl RF, hanoi ; call hanoi
lda RF, 1
end add RE, RB, R0 ; ret
ldi RB, RE
add RE, RE, RF
ldi RF, RE
jr RF
最後是 cyy 組譯器產出的 machine code:
10: 7EFE 11: 7F01 12: 7C02 13: BC0E 14: 2EEF 15: 7C01 16: BC0E 17: 2EEF 18: 7C00 19: BC0E 1A: 2EEF 1B: 8CFF 1C: BC0E 1D: 2EEF 1E: FF24 1F: 7F01 20: 7F04 21: 1EEF 22: 7F01 23: 0000 24: BF0E 25: 7F01 26: 2EEF 27: BB0E 28: 1BE0 29: 2EEF 2A: 7F02 2B: 1FBF 2C: AD0F 2D: 7F01 2E: CD73 2F: 7F04 30: 1FBF 31: AD0F 32: 7F01 33: BD0E 34: 2EEF 35: 7F05 36: 1FBF 37: AD0F 38: 7F01 39: BD0E 3A: 2EEF 3B: 7F03 3C: 1FBF 3D: AD0F 3E: 7F01 3F: BD0E 40: 2EEF 41: 7F02 42: 1FBF 43: AD0F 44: 7F01 45: 2DDF 46: BD0E 47: 2EEF 48: FF24 49: 7F01 4A: 2EBF 4B: 7F03 4C: 1FBF 4D: AD0F 4E: 7F01 4F: 7F04 50: 5DDF 51: 7F01 52: 7F05 53: 1FBF 54: AC0F 55: 7F01 56: 1DDC 57: 9DFF 58: 7F05 59: 1FBF 5A: AD0F 5B: 7F01 5C: BD0E 5D: 2EEF 5E: 7F03 5F: 1FBF 60: AD0F 61: 7F01 62: BD0E 63: 2EEF 64: 7F04 65: 1FBF 66: AD0F 67: 7F01 68: BD0E 69: 2EEF 6A: 7F02 6B: 1FBF 6C: AD0F 6D: 7F01 6E: 2DDF 6F: BD0E 70: 2EEF 71: FF24 72: 7F01 73: 1EB0 74: AB0E 75: 1EEF 76: AF0E 77: EF00
其中有一些 redundant instructions,可以想想組譯時如何消除。估計跑 16 個盤子沒問題,堆疊不會爆。
--
JK-extended assembler 當然沒那麼快寫好 XD。


<< 回到主頁