! ! The Towers Of Hanoi ! SPARC Assembly Language ! Copyright (C) 2001 Amit Singh. All Rights Reserved. ! http://hanoi.kernelthread.com ! ! Tested on an Ultra-5 ! .align 4 .global main main: save %sp, -112, %sp st %i0, [%fp + 68] st %i1, [%fp + 72] ! atoi(argv[1]) ! mov 4, %o0 ld [%fp + 72], %o2 add %o0, %o2, %o1 ld [%o1], %o0 call atoi nop mov %o0, %o1 mov %o1, %o0 ! Tower labels { from => 1, to => 3, using => 2 } ! mov 1, %o1 mov 3, %o2 mov 2, %o3 call hanoi nop ret restore MOVESTR: .asciz "%d -> %d\n" .align 4 .global hanoi hanoi: save %sp, -112, %sp st %i0, [%fp + 68] st %i1, [%fp + 72] st %i2, [%fp + 76] st %i3, [%fp + 80] ld [%fp + 68], %o0 ! (n <= 1) ! cmp %o0, 1 bne RECURSE nop ! print the move ! sethi %hi(MOVESTR), %o1 or %o1, %lo(MOVESTR), %o0 ld [%fp + 72], %o1 ld [%fp + 76], %o2 call printf nop b done nop RECURSE: ld [%fp + 68], %o0 add %o0, -1, %o1 mov %o1, %o0 ld [%fp + 72], %o1 ld [%fp + 80], %o2 ld [%fp + 76], %o3 call hanoi nop sethi %hi(MOVESTR), %o1 or %o1, %lo(MOVESTR), %o0 ld [%fp + 72], %o1 ld [%fp + 76], %o2 call printf nop ld [%fp + 68], %o0 add %o0, -1, %o1 mov %o1, %o0 ld [%fp + 80], %o1 ld [%fp + 76], %o2 ld [%fp + 72], %o3 call hanoi nop done: ret restore ! FINIS