Telefonino.net network
 
| 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 » |

Torna indietro   WinTricks Forum > Software > Programmazione

Notices

Rispondi
 
Strumenti discussione
Vecchio 07-08-2008, 11.26.15   #1
Lorenzo3
Senior Member
 
Registrato: 01-03-2006
Messaggi: 249
Lorenzo3 promette bene
...qualcuno conosce MIPS?

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:

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.
Lorenzo3 non è collegato   Rispondi citando
Vecchio 08-08-2008, 16.01.56   #2
Lorenzo3
Senior Member
 
Registrato: 01-03-2006
Messaggi: 249
Lorenzo3 promette bene
Specifico: mi dà errore di non allineamento.
___________________________________

1 + 1 = 3, for large values of 1.
Lorenzo3 non è collegato   Rispondi citando
Vecchio 09-08-2008, 03.34.06   #3
Alucart
Newbie
 
Registrato: 09-08-2008
Messaggi: 7
Alucart promette bene
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.
Alucart non è collegato   Rispondi citando
Vecchio 09-08-2008, 18.33.48   #4
Lorenzo3
Senior Member
 
Registrato: 01-03-2006
Messaggi: 249
Lorenzo3 promette bene
Quota:
Inviato da Alucart
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.
Infatti io avevo provato a spostare l'istruzione .align 2 che vedi all'inizio.
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
Come si spiega?
___________________________________

1 + 1 = 3, for large values of 1.
Lorenzo3 non è collegato   Rispondi citando
Vecchio 09-08-2008, 19.56.20   #5
Alucart
Newbie
 
Registrato: 09-08-2008
Messaggi: 7
Alucart promette bene
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)
Alucart non è collegato   Rispondi citando
Vecchio 09-08-2008, 20.18.19   #6
Lorenzo3
Senior Member
 
Registrato: 01-03-2006
Messaggi: 249
Lorenzo3 promette bene
Quota:
Inviato da Alucart
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)
Eh no, align n significa allinea a 2^n...
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.
Lorenzo3 non è collegato   Rispondi citando
Vecchio 09-08-2008, 21.36.12   #7
Alucart
Newbie
 
Registrato: 09-08-2008
Messaggi: 7
Alucart promette bene
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.
Alucart non è collegato   Rispondi citando
Vecchio 09-08-2008, 21.49.34   #8
Lorenzo3
Senior Member
 
Registrato: 01-03-2006
Messaggi: 249
Lorenzo3 promette bene
.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.
Lorenzo3 non è collegato   Rispondi citando
Vecchio 09-08-2008, 22.09.32   #9
Alucart
Newbie
 
Registrato: 09-08-2008
Messaggi: 7
Alucart promette bene
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.
Alucart non è collegato   Rispondi citando
Vecchio 09-08-2008, 22.47.49   #10
Lorenzo3
Senior Member
 
Registrato: 01-03-2006
Messaggi: 249
Lorenzo3 promette bene
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.
Lorenzo3 non è collegato   Rispondi citando
Vecchio 10-08-2008, 00.08.59   #11
Alucart
Newbie
 
Registrato: 09-08-2008
Messaggi: 7
Alucart promette bene
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
Alucart non è collegato   Rispondi citando
Vecchio 10-08-2008, 00.51.30   #12
Lorenzo3
Senior Member
 
Registrato: 01-03-2006
Messaggi: 249
Lorenzo3 promette bene
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.
Lorenzo3 non è collegato   Rispondi citando
Vecchio 10-08-2008, 03.03.21   #13
Alucart
Newbie
 
Registrato: 09-08-2008
Messaggi: 7
Alucart promette bene
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...
Tra l'altro per allocare la jump table, visto che è statica da quel poco che vedo qui, bastava scrivere:
Codice:
tabella:
.dw inserimento, riconoscimento, uscita
A meno che non sia fatto apposta l'esercizio.

Ultima modifica di Alucart : 10-08-2008 alle ore 03.08.03
Alucart non è collegato   Rispondi citando
Vecchio 11-08-2008, 02.02.28   #14
Lorenzo3
Senior Member
 
Registrato: 01-03-2006
Messaggi: 249
Lorenzo3 promette bene
Temo con questa storia dell'allineamento di averti definitivamente perso .
___________________________________

1 + 1 = 3, for large values of 1.
Lorenzo3 non è collegato   Rispondi citando
Vecchio 11-08-2008, 02.08.39   #15
Alucart
Newbie
 
Registrato: 09-08-2008
Messaggi: 7
Alucart promette bene
Allora mi sa che dovrai rileggerti quello che ho scritto nel mio primo messaggio.
Alucart non è collegato   Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is ON
Gli smilies sono ON
[IMG] è ON
Il codice HTML è OFF

Vai al forum

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

Orario GMT +2. Ora sono le: 14.41.41.


E' vietata la riproduzione, anche solo in parte, di contenuti e grafica.
Copyright © 1999-2017 Edizioni Master S.p.A. p.iva: 02105820787 • Tutti i diritti sono riservati
L'editore NON si assume nessuna responsabilità dei contenuti pubblicati sul forum in quanto redatti direttamente dagli utenti.
Questi ultimi sono responsabili dei contenuti da loro riportati nelle discussioni del forum
Powered by vBulletin - 2010 Copyright © Jelsoft Enterprises Limited.