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 frown ) [ 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

[ 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

Topic attachments
ISorted ascending Attachment History Action Size Date Who Comment
Microsoft Excel Spreadsheetxls tartaglia.xls   manage 15.0 K 2001-04-17 - 10:13 AndreaSterbini Calcolo del triangolo di tartaglia (tart(i,j))
Edit | Attach | Watch | Print version | History: r62 < r61 < r60 < r59 < r58 | Backlinks | Raw View | Raw edit | More topic actions
Topic revision: r62 - 2002-03-26 - AndreaSterbini






 
Questo sito usa cookies, usandolo ne accettate la presenza. (CookiePolicy)
Torna al Dipartimento di Informatica
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback