Codice Assembly per la porta di output vista a lezione mercoledì 31-10-07

Versione Completa   Stampa   Cerca   Utenti   Iscriviti     Condividi : FacebookTwitter
fbcyborg
00venerdì 2 novembre 2007 12:35
Per favore qualcuno mi può commentare/descrivere il seguente codice?
Prima di tutto sugli appunti ho "R3 30h" prima del seguente codice.
OUT R3,31h

OUT #1,31h
OUT R3,30h


Ho capito perfettamente il funzionamento della porta di output descritta poco prima di questo codice... Registro selettore, SEL1 e SEL0... Ma queste tre righe mi lasciano perplesso perché mi sfugge qualcosa e non riesco a vedere il percorso dei dati sul circuito a cui fanno riferimento.
Ad occhio mi sembra di capire che la situazione iniziale è che in R3 ho 30h. Però già non mi torna molto.. Che vuol dire? [SM=g9609] [SM=g9609]
Io pensavo che 30h e 31h fossero gli indirizzi fisici del registro selettore e della porta di output generica. Però poi non mi tornano i conti...
Allora
Per prima cosa mando il contenuto di R3 in 31h (non capisco.. in R3 cosa c'è? C'è il valore 30h??? Anche questo mi sfugge); poi sul dispositivo con indirizzo 31h, che a questo punto penso sia il multiplexer, mando la costante 1, perché voglio scrivere sul registro selettore.
Poi mando il contenuto di R3 sul dispositivo che ha indirizzo 30h, che a questo punto penso sia il gruppo di registri da 32 bit ciascuno. Quindi in R3 c'era il dato a 32 bit da memorizzare nella porta di output.

Allora, concludendo, le ultime 2 istruzioni mi convincono, ma la prima no.. Qualcuno può farmi un po' di chiarezza per favore?

Grazie.
Max81rm
00venerdì 2 novembre 2007 21:35
Guarda provo a rispondere ma non ne sono molto sicuro.

L'istruzione "OUT R3,31h" si riferisce al primo modo con cui abbiamo realizzato l'interfaccia di output, e cioè spezzando gli 8 bit dell'IOAB in due parti da 4 bit. In questo caso credo che i bit 7-4 identifichino il dispositivo, i bit 3-0 invece uno tra i 16 registri all'interno del dispositivo. Messa così allora l'istruzione invierebbe il dato contenuto nel registro R3 (di 32 bit) all'interno del registro di indirizzo 31h (31h sarebbe 00110001, quindi 0011 indicherebbe il dispositivo, 0001 il registro all'interno di quel dispositivo). Con quest'istruzione il dato verrebbe scritto in un colpo solo..
Invece con le istruzioni:

OUT #1,31h
OUT R3,30h

sempre se ho capito bene.. con la prima si memorizza il valore costante "1" nel registro selettore facente parte del dispositivo di indirizzo pari ai primi sette bit di 31h, cioè "0011000". L'"1" finale aggiuntivo serve per attivare SEL1 e abilitare la scrittura nel registro selettore. Una volta fatto questo, si passa a memorizzare il dato contenuto in R3 nel registro desiderato. L'indirizzo di dispositivo resta lo stesso, "0011000", ma stavolta si aggiunge "0" per abilitare la scrittura in uno dei 16 registri del dispositivo e non in quello selettore (e quindi 31h diventa 30h).
Non ti assicuro al 100% niente di quello che ho detto! :-)
In effetti mercoledì ero uscito da lezione con una gran confusione, ho riordinato un pò le idee ma credo di essermi perso qualcosa per strada. Anzi, prima ho provato a fare uno schema dell'interfaccia di output, mi sa che tra poco la posto per farmi correggere se ho sbagliato qualcosa...
fbcyborg
00venerdì 2 novembre 2007 21:43
Re:
Max81rm, 11/2/2007 9:35 PM:

Guarda provo a rispondere ma non ne sono molto sicuro.

L'istruzione "OUT R3,31h" si riferisce al primo modo con cui abbiamo realizzato l'interfaccia di output, e cioè spezzando gli 8 bit dell'IOAB in due parti da 4 bit. In questo caso credo che i bit 7-4 identifichino il dispositivo, i bit 3-0 invece uno tra i 16 registri all'interno del dispositivo. Messa così allora l'istruzione invierebbe il dato contenuto nel registro R3 (di 32 bit) all'interno del registro di indirizzo 31h (31h sarebbe 00110001, quindi 0011 indicherebbe il dispositivo, 0001 il registro all'interno di quel dispositivo). Con quest'istruzione il dato verrebbe scritto in un colpo solo..
Invece con le istruzioni:

OUT #1,31h
OUT R3,30h

sempre se ho capito bene.. con la prima si memorizza il valore costante "1" nel registro selettore facente parte del dispositivo di indirizzo pari ai primi sette bit di 31h, cioè "0011000". L'"1" finale aggiuntivo serve per attivare SEL1 e abilitare la scrittura nel registro selettore. Una volta fatto questo, si passa a memorizzare il dato contenuto in R3 nel registro desiderato. L'indirizzo di dispositivo resta lo stesso, "0011000", ma stavolta si aggiunge "0" per abilitare la scrittura in uno dei 16 registri del dispositivo e non in quello selettore (e quindi 31h diventa 30h).
Non ti assicuro al 100% niente di quello che ho detto! :-)
In effetti mercoledì ero uscito da lezione con una gran confusione, ho riordinato un pò le idee ma credo di essermi perso qualcosa per strada. Anzi, prima ho provato a fare uno schema dell'interfaccia di output, mi sa che tra poco la posto per farmi correggere se ho sbagliato qualcosa...


Secondo me il tuo discorso non fa una piega... Mi pare che tu abbia proprio ragione..

Posta lo schema se vuoi, così gli diamo un'occhiata e vediamo se è come il mio.

Grazie

EDIT:
Max81rm, 11/2/2007 9:35 PM:

(31h sarebbe 00110001, quindi 0011 indicherebbe il dispositivo, 0001 il registro all'interno di quel dispositivo)


Aspetta però... non coincide benissimo con lo schema di esempio al quale ti riferisci.. Sempre se non ho copiato male dalla lavagna il codice di abilitazione per il dispositivo era 0110 e non 0011.
Il codice di abilitazione 0011 è nel secondo schema.. quello dove si parla di SEL0 e SEL1. Quindi a questo punto penso che quel codice assembly sia riferito tutto al secondo schema.
Max81rm
00venerdì 2 novembre 2007 22:27
Beh ricordo che ha detto "se avessi usato il circuito precedente avremmo dovuto scrivere OUT R3,31h", quindi secondo me non curandosi dell'indirizzo usato in precedenza, ha fatto l'esempio con l'indirizzo che aveva a disposizione in quel momento, per far cogliere meglio l'analogia..
fbcyborg
00venerdì 2 novembre 2007 22:33
Ah, ok.
pma
00sabato 3 novembre 2007 19:21
Re:
fbcyborg, 11/2/2007 12:35 PM:

Per favore qualcuno mi può commentare/descrivere il seguente codice?
Prima di tutto sugli appunti ho "R3 30h" prima del seguente codice.
OUT R3,31h

OUT #1,31h
OUT R3,30h




Possiamo avere due casi:

Primo caso -- Ad ogni registro di output corrisponde una porta di output col suo indirizzo specifico (è il caso più semplice). Se all'indirizzo 30h è allocata una porta che fa capo al dato registro, e il dato che voglio scrivere in tale registro sta nel registro di CPU R3, allora scrivo semplicemente

OUT R3, #30h


chiedendo che il dato presente in R3 deve essere inviato alla porta di indirizzo 30h, che nella fattispecie corrisponde univocamente al registro di output ad essa associato. (In realtà, come qualcuno ricorderà, dovrei specificare OUTB, OUTW o OUTL a seconda che voglia inviare un byte, una word o una longword; ma le modalità di trasferimento non cambiano, cambia soltanto il tipo di informazione trasmessa lungo l'I/O Data Bus.)

Secondo caso -- Ho molti registri di output, e sarebbe uno spreco usare un indirizzo di I/O per ciascuno di essi (addirittura, in certi casi, gli indirizzi di I/O disponibili potrebbero non bastare!). Allora uso la seguente tecnica:
(a) assegno un indice a ciascuno dei registri di output;
(b) prevedo un ulteriore registro, che chiamo "selettore" e che mantiene uno degli indici definiti in (a)
(c) associo una porta di output, col relativo indirizzo, al registro selettore;
(d) associo UNA SOLA porta di output, dunque un solo indirizzo di I/O, a TUTTI i registri indicizzati;
(e) nel momento in cui vado a scrivere su questa porta speciale, solo il registro identificato dall'indice in quel momento presente nel selettore sarà abilitato a catturare il dato.

Dal punto di vista della CPU, la semplice operazione del primo caso (v. sopra) adesso diventa solo leggermente più complessa: si tratta prima di inviare l'indice del registro interessato, e poi inviare il dato alla porta comune. Esempio:

SELECTOR EQU #30h   ; indirizzo del selettore
COMMONPORT EQU #31h ; indirizzo della porta comune
; si vuole scrivere il dato presente in R3 nel registro di output che ha indice 27
OUT #27, #SELECTOR  ; emetto l'indice
OUT R3, #COMMONPORT ; emetto il dato, che finisce sul reg n. 27
Questa è la versione 'lo-fi' del Forum Per visualizzare la versione completa clicca qui
Tutti gli orari sono GMT+01:00. Adesso sono le 07:03.
Copyright © 2000-2024 FFZ srl - www.freeforumzone.com