|
| HOMEPAGE | INDICE FORUM | REGOLAMENTO | ::. | NEI PREFERITI | .:: | RSS Forum | RSS News | NEWS web | NEWS software | |
| PUBBLICITA' | | | ARTICOLI | WIN XP | VISTA | WIN 7 | REGISTRI | SOFTWARE | MANUALI | RECENSIONI | LINUX | HUMOR | HARDWARE | DOWNLOAD | | | CERCA nel FORUM » | |
07-08-2008, 11.26.15 | #1 |
Senior Member
Registrato: 01-03-2006
Messaggi: 249
|
...qualcuno conosce MIPS?
Codice:
.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
___________________________________
1 + 1 = 3, for large values of 1. |
08-08-2008, 16.01.56 | #2 |
Senior Member
Registrato: 01-03-2006
Messaggi: 249
|
Specifico: mi dà errore di non allineamento.
___________________________________
1 + 1 = 3, for large values of 1. |
09-08-2008, 03.34.06 | #3 |
Newbie
Registrato: 09-08-2008
Messaggi: 7
|
Non puoi usare SW su indirizzi non multipli di 4, stessa cosa per SH con indirizzi non multipli di 2. Visto che hai attribuito space 1 a S, semplicemente utilizza SB per memorizzare il valore.
|
09-08-2008, 18.33.48 | #4 | |
Senior Member
Registrato: 01-03-2006
Messaggi: 249
|
Quota:
La cosa buffa è che, sia che io la togliessi sia che la mettessi prima di tutte le allocazioni, mi dava errore di allineamento quando andavo ad allocare la jump table. Ecco il codice di cui parlo: Codice:
la $s0, tabella # Costruzione della jump table per la scelta dal menu' la $t0, inserimento sw $t0, 0($s0) la $t0, riconoscimento sw $t0, 4($s0) la $t0, uscita sw $t0, 8($s0) j ripeti_menu
___________________________________
1 + 1 = 3, for large values of 1. |
|
09-08-2008, 19.56.20 | #5 |
Newbie
Registrato: 09-08-2008
Messaggi: 7
|
Devi usare align 4, non 2. Te l'ho già spiegato, gli indirizzi non multipli di 4 non vanno con SW. Altra cosa: a meno che non sia l'assemblatore a prendersene cura, jump e branch eseguono l'istruzione immediatamente dopo, quindi ci devi per forza mettere qualcosa dopo altrimenti il codice immeditamente successivo verrà eseguito prima del tempo. Esempio:
Codice:
la $s0, tabella # Costruzione della jump table per la scelta dal menu' la $t0, inserimento sw $t0, 0($s0) la $t0, riconoscimento sw $t0, 4($s0) la $t0, uscita j ripeti_menu sw $t0, 8($s0) |
09-08-2008, 20.18.19 | #6 | |
Senior Member
Registrato: 01-03-2006
Messaggi: 249
|
Quota:
Sei sicuro che viene eseguita l'istruzione immedietamente dopo? Anche se il codice non viene eseguito direttamente dalla CPU ma da un emulatore? E se ci mettessi uno spazio bianco...?
___________________________________
1 + 1 = 3, for large values of 1. |
|
09-08-2008, 21.36.12 | #7 |
Newbie
Registrato: 09-08-2008
Messaggi: 7
|
Il valore di align indica byte, non potenze di 2. Metti align 4 e vedrai che il problema dell'allineamento sparirà.
Per il fatto dei salti, sì, sicuro. Mai sentito parlare di lazy jump? È un errore in cui incappano molti alle prime armi con i processori MIPS. Stessa cosa con i delay slot e l'allineamento. Comunque non capisco a che serve uno spazio bianco... Al massimo un nop per compensare, ma se hai un'istruzione prima che può essere eseguita insieme al salto, sposta quella, come nell'esempio che ti ho scritto su. |
09-08-2008, 21.49.34 | #8 |
Senior Member
Registrato: 01-03-2006
Messaggi: 249
|
.align n
indicates that the items on the succeeding lines should be aligned on a 2^n byte boundary Ti ho riportato direttamente dall'Appendice del libro di Laurus... Il lazy branch ho il dubbio che non ci sia nell'emulatore che usiamo, anche perché non mi ha mai dato fastidio e il professore a che io sappia non ne ha accennato minimamente.
___________________________________
1 + 1 = 3, for large values of 1. |
09-08-2008, 22.09.32 | #9 |
Newbie
Registrato: 09-08-2008
Messaggi: 7
|
Con GCC è sempre stato un valore espresso in byte, a meno che le mia versione non sia stata alterata apposta, ma dubito.
Il lazy jump mi sembra strano non ci sia visto che dovrebbe esserci su tutti i MIPS. Evidentemente l'assemblatore che utilizzate lo inserisce automaticamente o l'emulatore è tarocco. |
09-08-2008, 22.47.49 | #10 |
Senior Member
Registrato: 01-03-2006
Messaggi: 249
|
E chi ti ha detto che uso GCC? Comunque controlla meglio anche tu la tua versione...
Su PCSPIM c'è un'opzione "delayed branch" non settata... magari è quello
___________________________________
1 + 1 = 3, for large values of 1. |
10-08-2008, 00.08.59 | #11 |
Newbie
Registrato: 09-08-2008
Messaggi: 7
|
Infatti io non mi riferivo a quello che usi tu, ma a quello che uso io regolarmente. Per il lazy jump, immaginavo ci fosse una direttiva di mezzo, per cui l'emulatore lo simula e il tuo professore non t'ha detto una parola a riguardo. ;D
PS: Ma il programma alla fine lo dà ancora il problema di allineamento usando align 4? Ultima modifica di Alucart : 10-08-2008 alle ore 00.14.42 |
10-08-2008, 00.51.30 | #12 |
Senior Member
Registrato: 01-03-2006
Messaggi: 249
|
E daglie con questo align 4 non li allineo i dati a 16 byte!
Per quanto riguarda i problemi con .align 2, vedi sopra.
___________________________________
1 + 1 = 3, for large values of 1. |
10-08-2008, 03.03.21 | #13 |
Newbie
Registrato: 09-08-2008
Messaggi: 7
|
Mi sa che hai frainteso la descrizione, come ho fatto anche io leggendo quella riportata poco sopra. Il parametro di align deve essere una potenza di 2, non vuol dire che è generato come una potenza di n^2.
Codice:
The ALIGN directive is accompanied by a number (X). This number (X) must be a power of 2. That is 2, 4, 8, 16, and so on... Codice:
tabella: .dw inserimento, riconoscimento, uscita Ultima modifica di Alucart : 10-08-2008 alle ore 03.08.03 |
11-08-2008, 02.02.28 | #14 |
Senior Member
Registrato: 01-03-2006
Messaggi: 249
|
Temo con questa storia dell'allineamento di averti definitivamente perso .
___________________________________
1 + 1 = 3, for large values of 1. |
11-08-2008, 02.08.39 | #15 |
Newbie
Registrato: 09-08-2008
Messaggi: 7
|
Allora mi sa che dovrai rileggerti quello che ho scritto nel mio primo messaggio.
|
Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti) | |
Strumenti discussione | |
|
|
Discussioni simili | ||||
Discussione | Autore discussione | Forum | Risposte | Ultimo messaggio |
WWW File Share, qualcuno lo conosce? | Fat George | Internet e Reti locali | 8 | 04-03-2006 16.40.18 |
Qualcuno conosce queste voci? | Arthur85 | Sicurezza&Privacy | 37 | 24-09-2005 16.49.25 |
GHS - Google Cavern 1.0 .. interessa a qualcuno ? | maxprogramming | Segnalazioni Web | 3 | 12-06-2005 00.23.46 |
Qualcuno conosce Geoshell??? | GoTo2001 | Software applicativo | 5 | 20-11-2004 16.21.00 |
C'e' qualcuno con cellulare 3? | infinitopiuuno | Chiacchiere in libertà | 31 | 01-11-2004 01.30.46 |