Я бы хотел реализовать алгоритм Hanoi Towers в сборке MIPS.
Стержни обозначены A
, B
и C
.
Ввод - количество дисков, а выход - последовательность ходов, необходимых для решения проблемы.
Например:
Если ввод 3
, вывод должен быть:
A>C
A>B
C>B
A>C
B>A
B>C
A>C
Мне удалось получить результат с номерами стержней, т.е. 1>3
вместо A>C
, со следующим кодом:
.data
NewLine: .asciiz "\n"
To: .asciiz ">"
.globl main
.text
main:
li $v0, 5
syscall
add $a0, $v0, $zero
addi $a1, $zero, 1
addi $a2, $zero, 3
addi $a3, $zero, 2
jal hanoi1
li $v0, 10
syscall
hanoi1:
addi $t0, $a0, 0
addi $t1, $zero, 1
bne $a0, $t1, hanoi2
li $v0, 1
move $a0, $a1
syscall
li $v0, 4
la $a0, To
syscall
li $v0, 1
move $a0, $a2
syscall
li $v0, 4
la $a0, NewLine
syscall
addi $a0, $t0, 0
jr $ra
hanoi2:
addi $sp, $sp, -20
sw $ra, 16($sp)
sw $a3, 12($sp)
sw $a2, 8($sp)
sw $a1, 4($sp)
sw $a0, 0($sp)
addi $t3, $a3, 0
addi $a3, $a2, 0
addi $a2, $t3, 0
addi $a0, $a0, -1
jal hanoi1
lw $ra, 16($sp)
lw $a3, 12($sp)
lw $a2, 8($sp)
lw $a1, 4($sp)
lw $a0, 0($sp)
addi $t0, $a0, 0
addi $t1, $zero, 1
li $v0, 1
move $a0, $a1
syscall
li $v0, 4
la $a0, To
syscall
li $v0, 1
move $a0, $a2
syscall
li $v0, 4
la $a0, NewLine
syscall
addi $a0, $t0, 0
addi $t3, $a3, 0
addi $a3, $a1, 0
addi $a1, $t3, 0
addi $a0, $a0, -1
jal hanoi1
lw $ra, 16($sp)
addi $sp, $sp, 20
add $v0, $zero, $t5
jr $ra
Я пытался добавить ярлыки, такие как:
PrintA:
li $v0, 4
la $a0, A
syscall
jr $ra
И добавьте beq
к ветке с правой меткой:
beq $a1, $t7, PrintA # $t7=1
beq $a1, $t8, PrintB # $t8=2
beq $a1, $t9, PrintC # $t9=3
Но программа попала в бесконечный цикл, возможно потому, что я неправильно обработал $ra
.
Так что моя проблема в том, что я не могу понять, как преобразовать числа стержней в буквы.
Буду признателен за любую помощь.