Program to solve the Towers of Hanoi problem for 6 disks


    AREA data, ALIGN=2
nMoves SPACE 4
    GLOBAL __main
    AREA program, CODE, READONLY
    EXPORT __main
__main MOV R0, #0 ; start with number of moves = 0
    LDR R1, =nMoves ; load nMoves address
    STR R0, [R1] ; save nMoves = 0
    MOV R0, #6 ; solve for n=6
    MOV R1, #1 ; Move from peg 1
    MOV R2, #3 ; to peg 3
    MOV R3, #2 ; middle peg is 2
    BL HANOI ; solve the Hanoi puzzle HANOI(n, 6, 1, 3, 2)
    LDR R1, =nMoves ; load nMoves address
    LDR R0, [R1] ; load the final number of moves
DONE B DONE ; stay here to end program
    ALIGN
; Function Hanoi, solves the Towers of Hanoi problem using recursion
; saves the number of moves in the global variable nMoves
; HANOI(n, from, to, mid)
HANOI PUSH {R4-R7, LR} ; save registers
    CMP R0, #1 ; if we are solving for 1 disk
    BNE HANOI_MOVE ; if it's not 1, make move
    LDR R1, =nMoves ; load nMoves address
    LDR R0, [R1] ; load current number of moves
    ADD R0, R0, #1 ; increment 1 move
    STR R0, [R1] ; update moves in variable
    B HANOI_RETURN ; return to caller
HANOI_MOVE MOV R4, R0 ; save arguments in saved registers
    MOV R5, R1
    MOV R6, R2
    MOV R7, R3
    SUB R0, R4, #1 ; pass n - 1 for call
    MOV R1, R5 ; pass same from value
    MOV R2, R7 ; pass old mid as to for call
    MOV R3, R6 ; pass old to as mid for call
    BL HANOI ; HANOI(n-1, from, mid, to)
    LDR R1, =nMoves ; load nMoves address
    LDR R0, [R1] ; load current number of moves
    ADD R0, R0, #1 ; increment 1 move
    STR R0, [R1] ; update moves in variable
    SUB R0, R4, #1 ; pass n - 1 for call
    MOV R1, R7 ; pass old mid as from value
    MOV R2, R6 ; pass old to as to for call
    MOV R3, R5 ; pass old from as mid for call
    BL HANOI ; HANOI(n-1, mid, to, from)
HANOI_RETURN POP {R4-R7, LR} ; restore registers
    BX LR ; return to caller
    ALIGN
    END