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 ```