00 03/11/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
[Modificato da pma 03/11/2007 19:25]