Towers of Hanoi: Difference between revisions

Content added Content deleted
(+ MIPS Assembly (MARS))
Line 2,385: Line 2,385:
Move plate 2 from tower 2 to tower 3
Move plate 2 from tower 2 to tower 3
Move plate 1 from tower 1 to tower 3</pre>
Move plate 1 from tower 1 to tower 3</pre>

=={{header|MIPS Assembly}}==
<!--
Python equivalent:
def hanoi(n, From='A', To='B', Aux='C'):
def output():
print("Move disk %d from rod %s to rod %s" % (n, From, To))
if n==1:
output()
return
hanoi(n-1, From, Aux, To)
output()
hanoi(n-1, Aux, To, From)
hanoi(3)
--><lang mips>
# Towers of Hanoi
# MIPS assembly implementation (tested with MARS)
# Source: https://stackoverflow.com/questions/50382420/hanoi-towers-recursive-solution-using-mips/50383530#50383530

.data
prompt: .asciiz "Enter a number: "
part1: .asciiz "\nMove disk "
part2: .asciiz " from rod "
part3: .asciiz " to rod "

.text
.globl main
main:
li $v0, 4 # print string
la $a0, prompt
syscall
li $v0, 5 # read integer
syscall

# parameters for the routine
add $a0, $v0, $zero # move to $a0
li $a1, 'A'
li $a2, 'B'
li $a3, 'C'

jal hanoi # call hanoi routine

li $v0, 10 # exit
syscall

hanoi:

#save in stack
addi $sp, $sp, -20
sw $ra, 0($sp)
sw $s0, 4($sp)
sw $s1, 8($sp)
sw $s2, 12($sp)
sw $s3, 16($sp)

add $s0, $a0, $zero
add $s1, $a1, $zero
add $s2, $a2, $zero
add $s3, $a3, $zero

addi $t1, $zero, 1
beq $s0, $t1, output

recur1:

addi $a0, $s0, -1
add $a1, $s1, $zero
add $a2, $s3, $zero
add $a3, $s2, $zero
jal hanoi

j output

recur2:

addi $a0, $s0, -1
add $a1, $s3, $zero
add $a2, $s2, $zero
add $a3, $s1, $zero
jal hanoi

exithanoi:

lw $ra, 0($sp) # restore registers from stack
lw $s0, 4($sp)
lw $s1, 8($sp)
lw $s2, 12($sp)
lw $s3, 16($sp)

addi $sp, $sp, 20 # restore stack pointer

jr $ra

output:

li $v0, 4 # print string
la $a0, part1
syscall
li $v0, 1 # print integer
add $a0, $s0, $zero
syscall
li $v0, 4 # print string
la $a0, part2
syscall
li $v0, 11 # print character
add $a0, $s1, $zero
syscall
li $v0, 4 # print string
la $a0, part3
syscall
li $v0, 11 # print character
add $a0, $s2, $zero
syscall

beq $s0, $t1, exithanoi
j recur2
</lang>


=={{header|МК-61/52}}==
=={{header|МК-61/52}}==