Italiano - English

Architettura di un sistema basato su microprocessore Intel 8086

Sommario

    Esercitazioni di Informatica Industriale
    1. Architettura di un sistema basato su microprocessore Intel 8086
    2. Gestione degli Interrupt su micropocessori 80/86
    3. Programmable Interrupt Controller (PIC Intel 8259a)
    4. Demo Kernel Multitasking
    5. La Porta Seriale
    6. La Porta Parallela

    Elementi di base sulla architettura di un sistema a microprocessore. Viene presentato lo schema generale, i registri ed le principali operazioni con i bit

     

     

    BUS = Collezione di segnali elettronici che derivano da una sorgente comune ed eseguono una funzione comune

    • BUS INDIRIZZI: seleziona un blocco e ne abilita una locazione precisa. La sua larghezza limita la dimensione del blocco
    • BUS DATI: passa le effettive informazioni tra il blocco abilitato e la CPU. La sua larghezza (8 bit nel 8088) influisce molto sulla velocità del calcolatore.
    • BUS DI CONTROLLO: definisce il tipo di comunicazione (lettura o scrittura), apre e chiude il collegamento.

    E' COMPITO DELLA CPU ATTIVARE CORRETTAMENTE OGNI BUS ED ASSICURARE UNA COMUNICAZIONE AFFIDABILE.

     

    SCHEMA DELL'ARCHITETTURA INTERNA DI UN MICROPROCESSORE STANDARD


    CONTATORE DI PROGRAMMA (PC): contiene l'indirizzo della successiva istruzione che deve essere eseguita

    PUNTATORE ALLO STACK (SP): contiene l'indirizzo della cima dello stack, usato per trattare subroutine ed interruzioni

    REGISTRI DI SEGMENTO: dividono la memoria in segmenti da 64kb. Vengono usati con altri registri a 16 bit per accedere a tutta la memoria disponibile.

    REGISTRI INDICE: contengono l'offset rispetto ad un registro segmento. Servono ad accedere a blocchi di memoria con una sola istruzione.

    REPERIMENTO DI UNA ISTRUZIONE DALLA MEMORIA (FETCHING)


    FASE 1: trasferimento del contenuto del PC nel bus indirizzi, emissione segnale di lettura.

    FASE 2: la memoria trasferisce sul bus dati il contenuto della cella di memoria all'indirizzo indicato.

    FASE 3: l'INSTRUCTION REGISTER contiene l'istruzione che viene passata al decodificatore che la interpreta ed emette la sequenza di segnali necessari ad eseguirla

    OSSERVAZIONE: Il PC è a soli 16 bit cioe' 216 byte (64Kb) di memoria indirizzabili.
    OSSERVAZIONE: durante la decodifica ed esecuzione , il bus indirizzi resta inutilizzato

    CALCOLO DI UN INDIRIZZO FISICO DI UNA LOCAZIONE DI MEMORIA


    LA CPU CALCOLA AUTOMATICAMENTE L'INDIRIZZO FISICO (20 bit) DI UNA LOCAZIONE DI MEMORIA , UNENDO IL SUO INDIRIZZO LOGICO (16 bit) CON IL CONTENUTO DI UN ALTRO REGISTRO

    Nel caso di una istruzione, il registro utilizzato automaticamente è CS, mentre l'indirizzo logico è PC. L'indirizzo fisico è CS:PC che è a 32 bit.

    Nel caso dell 8086/88 l'indirizzo fisico da 20 bit è ottenuto sommando l'indirizzo logico con il valore del segmento shiftato di 4 posizioni a sinistra (moltiplicato 16)

    IL PROGRAMMATORE PUO' AGIRE SUL CONTENUTO DEI REGISTRI DI SEGMENTO. INOLTRE PUO' DECIDERE DI VOLTA IN VOLTA QUALE REGISTRO DI SEGMENTO UTILIZZARE SCAVALCANDO L'IMPOSTAZIONE DI DEFAULT

    I REGISTRI GENERALI DELL'8086/88

    -GRUPPO DATI: sono registri a 16 bit a cui si può accedere anche separatamente ai 2 byte che li compongono, rispettivamente high e low

    -GRUPPO PUNTATORI ED INDICI: registri a 16 bit

    • Stack Pointer (SP): Puntatore alla cima dell'area di stack
    • Base Pointer (BP):usato come registro base per i registri indice nelle funzioni di indicizzazione
    • Source Index (SI): usato come registro di indirizzamento origine per i movimenti di blocchi di memoria
    • Destination Index (DI): usato come registro di indirizzamento destinazione per i movimenti di blocchi di memoria

    -REGISTRI DI SEGMENTAZIONE: sono registri a 16 bit che vengono utilizzati con altri registri per generare gli indirizzi a 20 bit.

    • Code Segment (CS): inizio della locazione di memoria che contiene il programma da eseguire
    • Data Segment (DS): primo byte della zona di memoria che contiene i dati.
    • Stack Segment (SS):inizio della parte di memoria dedicata allo stack
    • Extra Segment (ES): segmento da usare a seconda delle esigenze applicative.

    METODI DI INDIRIZZAMENTO

      

    MOV destinazione « sorgente

     

    IMMEDIATO: l'operando e' esplicito ed appare nell'istruzione es:

     
    MOV AX,324             ;AX «324 

    A REGISTRO: l'operando è uno dei registri interni

     
    MOV AX,BX              ;AX « BX 

    DIRETTO: l'operando è contenuto in una variabile di memoria, che deve essere indicata completamente

     
    MOV AX,var             ;AX « var
    MOV AX,ES:var          ;AX « ES:var 

    INDIRETTO A REGISTRO: l'operando è contenuto all'indirizzo contenuto in un registro. (questo registro contiene dunque un puntatore). Validi solo BX e SI

     
    MOV AX,[SI]            ;AX «[DS:SI] 
    MOV AX,[BX]            ;AX « [DS:BX] 

    INDIRETTO A REGISTRO CON SPOSTAMENTO: l'indirizzo dell'operando è dato dalla somma di una costante ed il contenuto di un registro interno

     
    MOV AX,var[DI]         ;AX « [DS:(var+DI)]

    INDIRETTO A REGISTRO CON BASE + INDICE + COSTANTE:

     
    MOV AX,var[BX][DI]     ;AX «[DS:(var+DI+BX)] 

    PORTE DI Input/Output

     

    UNA PORTA E' UN "POSTO" UNIVOCAMENTE IDENTIFICATO, PER LEGGERE E SCRIVERE DATI. NON FA PARTE DELLA MEMORIA DI SISTEMA (ROM e RAM)

    INPUT: il microprocessore legge il contenuto di una porta di I/O
    OUTPUT: Il microprocessore scrive in una porta di I/O

    L'INDIRIZZAMENTO DI UNA PORTA I/O AVVIENE SULLO STESSO BUS INDIRIZZI USATO PER LA MEMORIA, CONSIDERANDO SOLO I PRIMI 16 BIT (dei 20 totali) 216=65.535 porte di I/O (0..FFFFh)

    IL BUS DI CONTROLLO ATTIVA LA MEMORIA DI SISTEMA O UNA PORTA DI I/O A SECONDA DELL'ISTRUZIONE CORRENTE.

    ISTRUZIONI e INDIRIZZAMENTO di Input/Output

    LE ISTRUZIONI PER I/O SONO:

    -Assembler

    in accumulatore,porta
    out porta,accumulatore

    Il numero della porta (il suo indirizzo) può essere una costante da un byte (indirizzamento fisso), o nel registro DX (indirizzamento variabile).

    Se l'accumulatore è AL allora viene trasferito un byte, se AX due byte (quello indirizzato ed il successivo)

    -C

     
    int inport(int porta) /* word */ 
    char inportb(int porta) /* byte */
     
    outport(int porta,int valore) 
    outportb(int porta, char valore) 

    In questo caso l'indirizzamento è sempre variabile, mentre esistono istruzioni differenti per trasferire un byte (char) o una parola (int).

    DISPOSITIVI DI I/O


    QUALSIASI COMPONENTE HW CONTROLLATO DAL SISTEMA

    UN DISPOSITIVO PUO' ESSERE ASSOCIATO A PIU' PORTE O INDIRIZZI DI I/O, CHE IN GENERE SVOLGONO FUNZIONI DI STATO, CONTROLLO E COMANDO

    TRA QUESTI DISPOSITIVI TROVIAMO:

    -tastiera, monitor, porta seriale e parallela, timer programmabile (PIT 8253), gestore interrupt (PIC 8259), interfaccia parallela programmabile (PPI 8255), ecc...

    ESEGUIRE UNA OPERAZIONI DI I/O SU UNA PORTA ASSOCIATA AD UN DISPOSITIVO, SIGNIFICA ACCEDERE DIRETTAMENTE AL DISPOSITIVO

    PER MOLTI DISPOSITIVI VI SONO DEGLI INTERRUPT (DOS e/o BIOS) CHE VI ACCEDONO, COME PER LA PORTA SERIALE.

    IN GENERALE SI ACCEDE ALLE PORTE DI UN DISPOSITIVO QUANDO NON ESISTE UN INT DEDICATO O SI DESIDERA UNA MAGGIORE VELOCITA'

    MASCHERE DI BIT


    SI UTILIZZANO PER ACCEDERE A SPECIFICI BIT ALL'INTERNO DI UN BYTE

    ESEMPIO:

    I pin 1..8 della porta parallela sono associati alla porta 378h. Il pin 1 è collegato direttamente al bit 0 .. il pin 8 al bit 7, della porta 378h. Per impostare ad alto (+5V) il pin 3 è necessario scrivere 1 nel bit 2 della 378h.

    Come fare per non cambiare lo stato dei rimanenti pin ??

     
    DB mask_bit_2 00000100b 
    DW porta 0378h 

    PER IMPOSTARE AD ALTO

     
    mov dx,porta 
    in al,dx ;leggo lo stato attuale 
    or al,mask_bit_2 ;metto alto il bit 2 
    out dx,al ;invio la modifica alla porta

    PER IMPOSTARE BASSO

     
    mov dx,porta
    in al,dx ;leggo lo stato attuale 
    and al,NOT mask_bit_2 ;metto basso il bit 2 
    out dx,al ;invio la modifica alla porta

    PER INVERTIRE LO STATO

     
    mov dx,porta 
    in al,dx ;leggo lo stato attuale 
    xor al,mask_bit_2 ;inverto lo stato del bit 2 
    out dx,al ;invio la modifica alla porta
     
    Vota questa pagina:

    1 Commenti:

    #1 Inviato da rob 07-05-2012

    mi è stato molto utile..

    Lascia il tuo commento:

    Note:
    • La tua email non è obligatoria e non sarà visibile in alcun modo
    • Si prega di inviare solo commenti relativi a questa pagina
    • Commenti inappropriati o offensivi saranno modificati o eliminati
    • Codici HTML non sono consentiti. Prego usare i BB code:
      [b]bold[/b], [u]underline[/u], [i]italic[/i], [code]code[/code]
    Il codice, le illustrazioni e gli esempi riportati in questa pagina sono solo a scopo illustrativo. L'autore non prende alcuna responsabilità per il loro utilizzo da parte dell'utente finale.
    Questo materiale è di proprietà di Pk Lab ed è utilizzabile liberamente a condizione di citarne la fonte.