Spim FAQ 2001 (Frequently Asked Questions)
Qua sono raccolte le vostre domande sul
SimulatoreSpim e l'assembler
- Separate le domande con una riga orizzontale (quattro trattini)
- Precedete la domanda con 3 spazi e 3 "---+" in modo cha appaia nell'indice della pagina
- Firmate copiando "-- User.IlVostroWikiName - data <br>" (che è già pronto subito sotto la input box di editing)
La rappresentazione dei numeri è diversa tra Mac e PC
Spim usa la rappresentazione del processore su cui gira, per cui i byte di una word sono ordinati
diversamente nei sistemi con processor
BigEndian rispetto a quelli
LittleEndian
Etichetta iniziale del programma
- L'etichetta che identifica la parte principale del programma, 'main', deve avere per forza questo nome o se ne puo' mettere un altro? [ TommasoRosica ]
Spim per windows e per Unix vogliono che l'etichetta di inizio programma si chiami
main,
nella versione per Mac l'etichetta iniziale ha un nome diverso (che al momento non ricordo

)
[ AndreaSterbini ]
Piccolo errore in programma matrici
Nel primo programma che si trova su:
ListatiDeiProgrammiAssembler
alla riga 20 l'istruzione
li $t1, $t1, 0
è da sostituire con
li $t1,0
--
RobertoNovegno - 23 Mar 2001
OK, grazie, l'ho corretto.
[ AndreaSterbini ]
Visualizzazione risultati programmi
Per visualizzare i risultati dell'esecuzione dei programmi fattoriale e numeri di Fibonacci, si può per esempio mettere
al posto di move $a0, $t0
, che si trova in una delle prime righe, le seguenti istruzioni:
move $a0, $v0 # pone il contenuto del registro $v0 nel registro $a0
# va messo in $a0 perché è in questo registro che la syscall seguente andrà a leggere
# il numero intero da stampare
li $v0,1 # codice per stampare un intero
syscall # stampa risultato (numero intero)
--
RobertoNovegno - 23 Mar 2001
Certamente!
[ AndreaSterbini ]
Come saltare se "A minore o uguale a B"?
Guardando il programma di "se a > 0 allora b = c - a", come posso scrivere "<= x" anzichè 0 (istruzione BLEZ)?
--
TommasoRosica - 24 Mar 2001
Puoi usare la pseudoistruzione
ble (branch if less than or equal).
[ AndreaSterbini ]
Stampa elemento della matrice
Volevo passare alla syscall direttamente il valore preso dalla matrice per farlo stampare, è possibile ad esempio farlo così?
lw $a0,matrice($t2) #carico la cella in questione in $a0 per stamparla
--
StefanoMalagigi - 06 Apr 2001
Si, ammesso che il tuo array matrice sia costituito da word e non da -halfwords o da bytes - 07 Apr 2001
--
AngeloMassi
Inizializzando le righe dispari
E se devo riempire solo le righe dispari, all'inizio dovrò subito inizializzare il mio $t2, l'indice di scorrimento, a 40 in modo da "saltare" la prima riga?
--
StefanoMalagigi - 07 Apr 2001
Forse ti sei sbagliato a scrivere, infatti la prima riga è dispari e quindi dovresti iniziare dalla posizione 0 della tua matrice, nel caso volessi inizializzare solo le pari, è giusto iniziare direttamente dalla posizione 40, ma ovviamente dovrai anche inizializzare il tuo indice di riga (i) a 2, in modo che ogni qual volta i mod 2 =0 tu debba inscrementare il tuo $t2 di 40 e non di 4.
--
SimoneSilvestri - 08 Apr 2001
Veramente la prima riga è quella con indice zero e io credo debba essere considerata pari... quindi se devo considerare solo le dispari devo saltarla, o no??!
--
StefanoMalagigi - 08 Apr 2001
E'solo una convenzione, io preferisco assegnare 1,1 allaprima casella a sinistra della matrice, ma se assegni 0,0 è del tutto indifferente. Nel tuo caso quindi le righe dispari saranno 0,2,4,6... a me sembra scomodo.Ovviamente però la memoria inizia sempre dalla posizione 0 (se inizialmente l'hai dichiarata così).
--
SimoneSilvestri - 09 Apr 2001
Nel riempire le colonne
Nel riempire le colonne pari (dispari) è a nostra discrezione l'intendere lo scorrimento nella matrice come 'orizzontale' (come fatto finora con le righe) piuttosto che come 'verticale'? (Regolandoci ovviamente di conseguenza con lo spostamento degli indici nel caso dell'una o l'altra scelta). A me pare che funzioni in tutti e due i modi, ma volevo sapere se ce n'è uno preferibile.
--
StefanoMalagigi - 08 Apr 2001
Sì
[ AndreaSterbini ]
Sintassi direttive di allocazione memoria
Piero Boni ci fa notare che la sintassi abbreviata per le direttive di allocazione di memoria:
- .word 0:100 vuol dire alloca 100 words e inizializzale con 0 (e non "alloca 101 words", come pensavamo)
- .half 3:18 vuol dire alloca 18 half-words ed inizializzale tutte col valore 3
- ...
--
AndreaSterbini - 09 Apr 2001
Progetto1 Assembler - Problemi di overflow
Tart(10,10) restituisce un valore maggiore di quello che può
essere contenuto in una halfword con la rappresentazione in c-a2.
Quindi se nrig=10 in matrice[10][10] viene memorizzato un valore sbagliato. Questo era previsto o dobbiamo cercare di risolvere il problema?
--
MariaGraziaMerlo - 13 Apr 2001
Veramente Tart(10,10) = 48620 = 0xBDEC, che entra benissimo in una half word.
[ AndreaSterbini ]
Metto in attachment
https://twiki.di.uniroma1.it/pub/Architetture2/MZ/SpimFaq2001/tartaglia.xls che mostra i valori di tart(i,j) se il numero di righe/colonne è 10.
Progetto1 Assembler - overflow
Scusi ma i valori che si possono rappresentare in c-a2 con 16 bit(rappresentazione usata da spim) vanno da -32768 a 32767 ((2^15) -1)
perchè un bit viene riservato al segno. Quindi 48620 non può essere
rappresentato con una halfword. Inoltre se prova a memorizzare
48620 in una halfword e poi a stamparla viene visualizzato -16916
che non è il risultato corretto.
Lo stesso vale per la seconda parte del progetto dove il massimo valore rappresentabile in c-a2 con 1 byte è 127 e non 255.
Quindi ripropongo il mio quesito e le chiedo come posso risolvere il problema.
--
MariaGraziaMerlo - 17 Apr 2001
Per prima cosa una precisazione: il primo bit nella rappresentazione in complemento a 2
non è riservato al segno ma rappresenta, come gli altri bit, una potenza di 2 però con segno negativo.
Nel caso del triangolo di Tartaglia non siamo interessati alla rappresentazione in complemento a 2 ma vogliamo numeri positivi (o senza segno - unsigned).
N.B. Questo è un problema di interpretazione della stringa che si trova in una determinata posizione (indirizzo di memoria o registro) e quindi dipende da ciò che fa il programmatore e da come il programmatore la manipola e interpreta (non dal calcolatore).
Ci sono apposite istruzioni - vedi manuale - per ottenere numeri senza segno, vedi per esempio tra le istruzioni di caricamento (load).
[ AnnalisaMassini ]
Progetto1 Assembler
Nell'inserimento della dimensione della matrice si deve dichiarare la matrice 0:100 (e non 0:99) per evitare di stampare i risultati attaccati e scorretti in caso la dimensione sia 10
--
ShahzadHussain - 23 Apr 2001
Esatto, se definite una matrice di 99 locazioni ma scrivete su 100 scriverete sulla memoria subito dopo l'ultima locazione, rovinandone il contenuto. Per esempio:
- se dopo la matrice c'e' una stringa ne rovinerete i primi caratteri
- se dopo la matrice c'e' un parametro (p.es. nrig) ne cambierete il valore
- se la matrice era l'ultima zona di dati il programma darà una eccezione
--
AndreaSterbini - 06 May 2001
Progetto1 Assembler - verifica output
E' possibile mettere in rete anche mat2 per verificare l'output prima della consegna?
--
MariaGraziaMerlo - 26 Apr 2001
Subroutine tart
ho fatto la subroutine in word perchè se la cambio in half non viene?
--
LucaPace - 27 Apr 2001
Stai attento che non tutte le cose vanno trasformate in half ... ad esempio quando metti $ra sullo stack ricordati che e' un registro da 32 bits...
[ AndreaSterbini ]
Stampare la finestra Console
E' possibile stampare il contenuto della finestra Console su Spim?
--
StefanoMalagigi - 29 Apr 2001
Non so, prova con uno screen capture oppure copiandone il contenuto in un file di testo (e poi stampandolo).
--
AndreaSterbini - 10 May 2001
Gestione Stack
E' possibile incrementare lo stack pointer di 2 quando sto manipolando halfword o deve essere sempre incrementato di 4?
Grazie.
--
LucaPace - 30 Apr 2001
Sempre di 4 altrimenti i dati non saranno "allineati" e pertanto SPIM ti darà sempre errore. Per cui per memorizzare delle half nello stack, usa comunque 4 byte: ne saranno utilizzati solo 2, però SPIM li salverà e li rileggerà correttamente. (Questo limite dipende proprio da come hanno costruito il MIPS.)
--
RobertoNovegno - 01 May 2001
Non e' esatto.
Ho visto che l'importante e' aumentare e diminuire lo stack pointer di multipli di 4, ma non c'e' bisogno di usare 4 byte per le half.
Ad esempio, se devo mettere sullo stack il return address (4 byte) e 3 halfword (2 byte) mi basterebbero 10 byte, ma ne devo usare per forza 12. Pero' non ho bisogno di usarne 16.
--
DarioMariani - 07 May 2001
Richiesta di lezione supplementare sulle interruzioni
Potrebbe gentilmente fare un'altra lezione sulle interruzioni? Siamo in molti ad avere dei dubbi sulle modalita' d'uso. Grazie.
--
AnnaSemeraro - 07 May 2001
Per favore fatemi domande in laboratorio (se potete raggruppatevi).
Intanto iniziate a scrivere qua sotto le vostre domande ...
--
AndreaSterbini - 08 May 2001
Progetto2 assembler - problemi
Penso anche io che ci sia bisogno di almeno un'ulteriore lezione sugli interrupt (il più presto possibile!) perchè molti di noi hanno problemi a capire alcuni concetti oscuri.
Ad esempio le modifiche allo status e al receiver control vanno messe
dopo __start: o nella parte .ktext?
Inoltre negli appunti in rete viene impostato a 1 il bit 9 dello status (con la maschera 0x0200) e non il 10 come detto in classe...
--
MariaGraziaMerlo - 08 May 2001
Le modifiche di status a receiver control potete metterle sia nella
__start che nella vostra
main
Mi sono sbagliato io a lezione, il bit da settare a 1 è 0x0100, che e' il nono da destra (quindi il bit 8 contando il meno significativo come bit 0).
NOTA: questo si vede anche dagli esempi di programma scritti nella documentazione tratta dal sito di Milano
--
AndreaSterbini - 14 May 2001
Progetto2 -domanda
La password va letta con una syscall,oppure solo la domanda va fatta con la syscall?
--
MichelangeloGiulianelli - 09 May 2001
La password viene chiesta con syscall solo all'inizio (per memorizzarla in
password )
--
AndreaSterbini - 10 May 2001
Progetto2 - calcolo seconda matrice
Il nostro programma dell'esercizio1 calcola contemporaneamente gli elementi delle due matrici. Volendo calcolare separatamente mat2 (dopo aver verificato la password), dovremmo riscrivere parecchio codice (altri cicli, controllo consistenza registri temporanei, ecc...), dato che molti registri sono comuni alle due funzioni. Possiamo limitarci a verificare la password immediatamente prima della stampa di matrice2 ?
--
GabrielePersia - 09 May 2001
Oh, yeah!
--
AndreaSterbini - 10 May 2001
Trap handler
Quando si carica un programma assembler in spim, dopo aver caricato il trap.handler, nella simulazione passo-passo vengono caricate innanzi tutto le istruzioni presenti nell'etichetta
__start del trap handler. Ma non dovrebbe caricare quelle istruzioni solo quando effettivamente arriva un'interruzione? Oppure le memorizza all'inizio e le "conserva" nel caso dovesse arrivare un'interruzione? E inoltre, come facciamo a "bloccare" il programma tra il calcolo delle due matrici in attesa che gli arrivi un interrupt?
--
PaoloCencioni - 11 May 2001
Il codice nel trap.handler si occupa di far partire il programma che carichi in memoria dal'etichetta main; senza quel codice il programma dovrebbe iniziare con l'etichetta
__start. Il codice del trap.handler viene caricato tutto in memoria per essere invocato quando c'è un'interruzione o un'eccezione. Per bloccare il programma usa un loop.
--
VincenzoCorcione - 12 May 2001
Esatto.
--
AndreaSterbini - 14 May 2001
Riconoscimento della password
La password va riconosciuta in mezzo ad uno stream di caratteri? Es. se password=1234 la riconosco in mezzo a abc1234defg. Oppure devo confrontare buffer e password ogni 4 caratteri inseriti, contando dall'inizio, cioè metter in buffer i caratteri a 4 a 4? Es. se password=1234 la riconosco in mezzo a abcd1234pqrs ma non in mezzo a abc1234defg.
--
VincenzoCorcione - 12 May 2001
Devi continuamente controllare se buffer=password ... ci pensa il trap handler modificato a mettere ogni carattere battuto in buffer (nell'ordine corretto).
--
AndreaSterbini - 14 May 2001
Incremento...
Volevo una conferma: nel trap.handler dopo l'istruzione rfe viene incrementato il registro $k0, questo deve succedere soltanto dopo il ritorno da eccezione e NON dopo quello da interruzione..vero? Grazie.
--
LucaPace - 12 May 2001
Si'.
--
AndreaSterbini - 14 May 2001
Salto a trap handler
Una volta caricato nello Status il valore 513(=0x201=attivazione dei
bit 0 e 9 necessari all'abilitazione delle interruzioni)dovrebbe
bastare caricare all'indirizzo 0xffff0000 (Control Receiver)il valore
2 che dovrebbe attivare il bit 1, per far sì che ogni volta che un
tasto venga premuto venga lanciata un'interruzione di livello 0 e
quindi richiamato il trap handler.Non dico saltare al trap handler
(troppo facile), ma se non altro se l'interruzione viene lanciata
dovrebbe essere aggiornato il registro Cause. Verificato che il bit di
lettura e il registro di lettura funzionano in modo corretto
(l'interruzione pendente è segnalata e viene memorizzato il codice
ascii del tasto premuto),perchè non avviene nè l'aggiornamento del
Cause nè il salto al trap handler?C'è qualcosa di sbagliato nel
ragionamento?
Premesso che le attivazioni vengono fatte nel main, il quale viene
successivamente lasciato ciclare fino a che il contenuto del buffer
sia pari alla password(verifica che compie il trap handler
modificato).
--
ElisabettaFalivene - 14 May 2001
ATTENZIONE: nello Status dovete settare i bits 0x0101 invece che 0x0201 (vedi documentazione Milanese)
--
AndreaSterbini - 14 May 2001
Ancora sul trap handler
Quando parte un'interruzione, il programma salta nel trap handler nella parte ktext o in __start?
--
PaoloCencioni - 14 May 2001
Quando avviene un'interruzione (o un'eccezione) il programma salta all'inizio del trap.handler ( .ktext 0x80000080). Da __start invece inizia il programma quando lo mandi in esecuzione (F5) a meno che non specifichi un'altra locazione da dove iniziare, nella piccola finestra di dialogo che ti visualizza SPIM. In pratica quel famoso 0x00400000 (un indirizzo diverso se c'è del .text prima di __start) che SPIM ti propone di accettare quando mandi in esecuzione, normalmente è proprio l'istruzione dopo l'etichetta __start.
--
RobertoNovegno - 15 May 2001
Esercizi della prova del 10/4
Sul sito ci sono le soluzioni e il testo degli esercizi della prova del 10/4?
--
DamianoTaurino - 15 May 2001
Testi Prova scritta Assembly del 10/4
Li puoi trovare qui:
http://twiki.dsi.uniroma1.it/twiki/view/Lab_Architetture/ProvaScrittaAssembler2001
--
LorisSaraceno - 15 May 2001
HELP-HANDLER!
Il trap.handler mi memorizza i caratteri al contrario, come faccio ad invertili di posizione o eventualmente a invertire la password di partenza (in modo invisibile all'utente si intende)?
Grazie
--
LucaPace - 18 May 2001
Lo fa perche' ti trovi su una macchina little-endian .... lo devi gestire tu.
--
AndreaSterbini - 21 May 2001
Shift: logical o arithmetic?
Qualcuno sa la differenza tra Shift logical e arithmetic? E le varianti con VARIABLE? Thanks
--
TommasoRosica - 19 May 2001
Lo shift aritmetico corrisponde ad una moltiplicazione/divisione per 2, e quindi mantiene il segno del numero considerato nella codifica in complemento a 2.
Lo shift logico considera il registro una semplice stringa di bits.
--
AndreaSterbini - 21 May 2001
Lunghezza password e sua gestione
La password deve essere lunga per forza quattro caratteri, o anche meno? Inoltre, copiando un'eventuale password <= 3 caratteri in un'area di lunghezza word tramite la MOVE, essa viene inserita a partire "da destra" o "da sinistra" (cioè dai bit meno o più signficativi)?
--
TommasoRosica - 21 May 2001
Per l'ordine dei bytes vedi una risposta poco sopra.
La password e' da 4 o piu' caratteri (solo 4 se usi la syscall 8 col parametro $a1 = 5)
--
AndreaSterbini - 21 May 2001
Messaggi di errore di SPIM
Non è disponibile un elenco dei messaggi di errore del simulatore? Alcuni errori sono piuttosto criptici da capire (ad esempio UNALIGNED ADDRESS IN STORE 0x ...); anche per avere un rapido riepilogo.
--
TommasoRosica - 21 May 2001
Vuol dire che stai leggendo una word da un indirizzo che non e' multiplo di 4, hai 2 possibili soluzioni:
- usa l'istruzione "load unaligned word"
- usa la direttiva ".align"
--
AndreaSterbini - 21 May 2001
Soluzioni Prova Scritta del 10-4
Quando sarà possibile consultare le soluzioni degli esercizi della prova di Assembler del 10-4?
--
StefanoMalagigi - 04 Jun 2001
Dubbio Compito A del 10-4
In riferimento al Compito A della prova scritta di Assembler del 10 aprile (entrambi i canali)... lo stesso codice deve realizzare entrambe le situazioni, cioè che la tabella sia di dimensioni pari o dispari oppure varia a seconda del caso?
Il numero delle righe e' parametrico, quindi lo stesso codice deve realizzare entrambi i casi.
--
AndreaSterbini - 13 Jun 2001
Esercizi
Chiunque fosse interessato, ho messo alcuni esercizi da me svolti, di assembly, con commenti e stampe su console per verifica del risultato. : ) Ecco il link:
MassimilianoAgostini
--
MassimilianoAgostini - 26 Jun 2001