Witam,
Dopiero rozpocząłem swoją przygodę z programowaniem oraz z assemblerem, dlatego być może moje pytanie jest banalne, ale nie mogę dojść do tego co właściwie jest nie tak w kodzie.
Program ma służyć do sprawdzania, czy wpisywane słowo jest palindromem.
Używam programu Mars 4.5.
To co dotychczas udało mi się wysmażyć:
.data
bufor: .asciiz
string_len: $t1 #długość podanego wyrazu
.text
first:
li $v0, 8
li $a1, 100
la $a0, bufor #pobieranie od 1 do 100 znaków z klawiatury
syscall
li $v0, 4
la $a0, bufor #wyświetlanie pobranego stringa
syscall
#liczenie ilości wprowadzonych znaków
li $a0, -1 #licznik ustawiony na -1, ponieważ enter wysyłający ciąg znaków też jest liczony jako znak
la $t0, bufor
loop: lb $t1, 0 ($t0) #załaduj do pamięci t1 pierwszy znak z t0
beq $t1, 0, next #jeżeli odczytamy znak to znak 0, to przeskocz w next (wyskocz z pętli)
addi $a0, $a0, 1 #wywołaj a0, a następnie dodaj do niego 1 i nadpisz jako a0
addi $t0, $t0, 1
b loop
next: li $v0, 1
syscall
compare: #pętla porównująca znaki
la $a0, string_len
lw $a0, 0($a0)
la $a1, bufor
jal isPalindrome
add $a0, $v0, $zero
jal printRes
addi $v0, $zero, 10
syscall
isPalindrome:
# pętla porównująca pierwszy z ostatnim znakiem
slti $t0, $a0, 2
bne $t0, $zero, returnTrue
lb $t0, 0($a1)
addi $t1, $a0, -1
add $t1, $t1, $a1
lb $t1, 0($t1) #w tej linii wyskakuje błąd
bne $t0, $t1, returnFalse
addi $a0, $a0, -2
addi $a1, $a1, 1
j isPalindrome
returnFalse:
addi $v0, $zero, 0
jr $ra
returnTrue:
addi $v0, $zero, 1
jr $ra
.data
IS_STRING: .asciiz " is"
NOT_STRING: .asciiz " NOT"
A_PAL_STRING: .asciiz " a PALinDROME!"
.text
printRes:
add $t4, $a0, $zero
addi $v0, $zero, 4
la $a0, bufor
syscall
la $a0, IS_STRING
syscall
bne $t4, $zero, printResCont
la $a0, NOT_STRING
syscall
printResCont:
la $a0, A_PAL_STRING
syscall
jr $ra
Słowo pobiera prawidłowo, obliczanie ilości znaków w słowie również przebiega jak należy.
Błąd, który wyświetla program:
Error in line 46: Runtime exception at 0x0040008c: address out of range 0x716b616a
Będę wdzięczny za wskazówki, co powinienem poprawić i na czym polega błąd.
Pozdrawiam! :)