Buonasera, ho appena svolto questo esercizio; i problemi che vorrei risolvere sono di fatto tre:
1) Avendo terminato i registri t, dovrei usare quelli s nella funzione, devo necessariamente usare anche lo stack?
2) purtroppo il programma da in output che la frase è sempre palindroma...
3) inoltre, quando salto ad una funzione, posso usare i registri temporanei, t, ripartendo da zero oppure devo cmq tener conto che li ho già usati nel main?
vi posto anche il lungo codice...che sarà sicuramente migliorabile
###########################################################
# ESAME del 9 Settembra 26
# #
# Scrivere un programma assembly il cui main richiami una funzione "palindrome".
# Tale funzione esegue l'input di una stringa di max 16 caratteri. La funzione deve
# ritornare un valore booleano vero o falso (1 o 0) a seconda che la stringa sia palindroma
# (è uguale letta sia da sinistra che da destra) o non palindroma. Il test non deve essere
# case - sensitive. Il main stamperà un messaggio opportuno a seconda del valore
# ritornato dalla funzione.
###########################################################
.global _main
.data
buffer: .space 16
str_in: .asciz "\n Dammi la stringa -> "
msg_out1: .asciz "\n La stringa è palindroma!"
msg_out2: .asciz "\n La stringa non è palindroma!"
flag: .asciz "\n flag"
white_space: .asciz " "
.text
_main:
la a0, str_in
li a7, 4
ecall
# Input della stringa da analizzare
la a0, buffer
li a1, 16
li a7, 8
ecall
la t0, buffer
# mv t0, a0
li t3, 65
li t4, 90
li t5, 10 # Carattere terminatore
lb t2, 0(t0) # Se il primo carattere inserito è invio, il programma termina
beq t2, t5, end # Programma che termina se si preme invio
loop_conversion:
lb t2, 0(t0)
beqz t2, step # La stringa non ha più caratteri
ori t2, t2, 0x20 # Converte il carattere maiuscolo in miscolo (0x20 = 32)
addi t0, t0, 1 # Scorro la stringa
j loop_conversion
step:
jal ra, palindrome
li t1, 1
bne a0, t1, frase_non_pal
la a0, msg_out1
li a7, 4
ecall
j _main
frase_non_pal:
la a0, msg_out2
li a7, 4
ecall
j _main
end:
# Fine del programma
li a7, 10
ecall
palindrome:
mv s1, t0 # s1 = puntatore sinistro (inizio stringa)
mv s2, t0 # s2 = puntatore destro (fine stringa)
fine_stringa:
lbu s3, 0(s2) # Carica il byte corrente
beqz s3, imposta_dx
addi s2, s2, 1 # Avanza al carattere successivo
j fine_stringa
imposta_dx:
addi s2, s2, -1 # Torna indietro di 1 per puntare all'ultimo carattere valido
ciclo_confronto:
bge s1, s2, palindroma # Se il puntatore sx >= puntatore dx, abbiamo finito con successo
lbu s3, 0(s1)
lbu s4, 0(s2)
bne s3, s4, non_palindroma # Se i caratteri sono diversi, la frase non è palindroma
addi s1, s1, 1 # Sposta il puntatore a destra
addi s2, s2, -1 # Sposta il puntatore a sinistra
j ciclo_confronto
palindroma:
li a0, 1
jr ra
non_palindroma:
li a0, 0
jr ra
Grazie in anticipo a chi mi risponde!