Lorenzo3
07-08-2008, 11.26.15
Nel caso, vorrei chiedere perché questo programma (di cui posto solo la parte iniziale) mi dà errore quando vado a fare sw $s2, 0($t0), ovvero l'ultima "store" riportata:
.data
#Messaggi per l'inserimento
mess_menu: .asciiz "\n\n1-Inserimento della grammatica\n2-Riconoscimento delle parole\n3-Uscita\nScelta: " # Menu'
mess_ricon: .asciiz "Riconoscimento." # Stub per riconoscimento
mess_iniziale: .asciiz "Inserire simbolo iniziale della grammatica: "
mess_NT: .asciiz "\nInserire prossimo simbolo non terminale: " # Richiesta nuovo non terminale
mess_prod: .asciiz "\nInserire produzione: " # Richiesta nuova produzione
# Messaggi di errore o di correttezza
mess_errore_prod: .asciiz "\n\nErrore: presenza di un non terminale inutile."
mess_errore_vuota: .asciiz "\n\nErrore: grammatica vuota."
mess_ok_check: .asciiz "\n\nLa grammatica inserita è corretta."
mess_no_gramm: .asciiz "\n\nImpossibile effettuare verifica: nessuna grammatica inserita"
# Valori e spazi
Z: .ascii "Z" # Simbolo non terminale fittizio Z
S: .space 1 # Spazio per simbolo iniziale della grammatica
NT: .space 2 # Spazio per nuovo non terminale
prod: .space 3 # Spazio per nuova produzione
coda: .space 2 # Spazio per puntatori inizio e fine coda
parola: .space 21 # Spazio per parola da verificare
M: .space 60 # Spazio per l'insieme M usato dalla procedura "riconoscimento"
N: .space 60 # Spazio per l'insieme N usato dalla procedura "riconoscimento"
.align 2
tabella: .space 12 # Spazio per la jump table
.align 0
.text
###Inserimento
proc_inserimento:
addi $sp, $sp, -16 # Allocazione dello stack
sw $ra, 0($sp) # Ci sono procedure interne, quindi esegue salvataggio
# indirizzo di ritorno
sw $s0, 4($sp) # $s0, $s1, $s2 verranno modificati, quindi salvali
sw $s1, 8($sp)
sw $s2, 12($sp)
move $s0 $zero # $s0 (= Testa) = 0
move $s1 $zero # $s1 (= Coda ) = 0
move $s2 $zero # Registro che conterrà i simboli non terminali correnti
la $a0, mess_iniziale # Stampa richiesta di inserimento del simboli iniziale
li $v0, 4
syscall
li $v0, 12 # Lettura simbolo iniziale, e...
syscall
move $s2, $v0 # ...successivo controllo della correttezza
beq $s2, $zero, errore_vuota
la $t0, S # Salvataggio del simbolo iniziale in opportuno
sw $s2, 0($t0) # spazio in memoria
.data
#Messaggi per l'inserimento
mess_menu: .asciiz "\n\n1-Inserimento della grammatica\n2-Riconoscimento delle parole\n3-Uscita\nScelta: " # Menu'
mess_ricon: .asciiz "Riconoscimento." # Stub per riconoscimento
mess_iniziale: .asciiz "Inserire simbolo iniziale della grammatica: "
mess_NT: .asciiz "\nInserire prossimo simbolo non terminale: " # Richiesta nuovo non terminale
mess_prod: .asciiz "\nInserire produzione: " # Richiesta nuova produzione
# Messaggi di errore o di correttezza
mess_errore_prod: .asciiz "\n\nErrore: presenza di un non terminale inutile."
mess_errore_vuota: .asciiz "\n\nErrore: grammatica vuota."
mess_ok_check: .asciiz "\n\nLa grammatica inserita è corretta."
mess_no_gramm: .asciiz "\n\nImpossibile effettuare verifica: nessuna grammatica inserita"
# Valori e spazi
Z: .ascii "Z" # Simbolo non terminale fittizio Z
S: .space 1 # Spazio per simbolo iniziale della grammatica
NT: .space 2 # Spazio per nuovo non terminale
prod: .space 3 # Spazio per nuova produzione
coda: .space 2 # Spazio per puntatori inizio e fine coda
parola: .space 21 # Spazio per parola da verificare
M: .space 60 # Spazio per l'insieme M usato dalla procedura "riconoscimento"
N: .space 60 # Spazio per l'insieme N usato dalla procedura "riconoscimento"
.align 2
tabella: .space 12 # Spazio per la jump table
.align 0
.text
###Inserimento
proc_inserimento:
addi $sp, $sp, -16 # Allocazione dello stack
sw $ra, 0($sp) # Ci sono procedure interne, quindi esegue salvataggio
# indirizzo di ritorno
sw $s0, 4($sp) # $s0, $s1, $s2 verranno modificati, quindi salvali
sw $s1, 8($sp)
sw $s2, 12($sp)
move $s0 $zero # $s0 (= Testa) = 0
move $s1 $zero # $s1 (= Coda ) = 0
move $s2 $zero # Registro che conterrà i simboli non terminali correnti
la $a0, mess_iniziale # Stampa richiesta di inserimento del simboli iniziale
li $v0, 4
syscall
li $v0, 12 # Lettura simbolo iniziale, e...
syscall
move $s2, $v0 # ...successivo controllo della correttezza
beq $s2, $zero, errore_vuota
la $t0, S # Salvataggio del simbolo iniziale in opportuno
sw $s2, 0($t0) # spazio in memoria