Laurea in Informatica a.a. 2010-2011 Laboratorio del corso di Architettura degli elaboratori (A) Modulo 1: l Architettura dell 8086 Valeria Carofiglio
Linguaggi a vari livelli e loro relazioni Programma A. (C,C++, Java) Compilatore.??? Versione di A eseguita Assemblatore Programma A in codice macchina
Linguaggi a vari livelli e loro relazioni Programma A. (C,C++, Java) Compilatore Programma A in linguaggio Assemby Versione di A eseguita Assemblatore Programma r A in codice macchina
Dalle istruzioni in binario al linguaggio i Assembly Programmazione in linguaggio i macchina binario i Per semplificare e velocizzare e preferibile impiegare una rappresentazione simbolica delle istruzioni Linguaggio assembly: Linguaggio i composto da istruzioni i i simboliche che corrispondono a istruzioni binarie simbolico add AX,BX al posto di 1000110010100000 Programma assemblatore (assembler): Prende in ingresso un programma scritto in assembly Genera il corrispondente programma in linguaggio macchina
Perché studiare l architettura dell 8086 in un corso di assembly Molte caratteristiche del linguaggio assembly rispecchiano fortemente l architettura su cui il programma deve girare
Componenti di base dell 8086 computazioni Dati Indirizzi Controllo BUS Dati e istruzioni Architettura di Von Newman
Memoria e I/O dell 8086 (cont.) CPU Execution Unit Bus Interface Unit organizzazione i Sistema di bus Interfaccia Interfaccia. Chips di mem. Dispositivi I/O Controller dati controllo indirizzi Accessi diretti a memoria
Memoria dell 8086 Memorizzazione di byte, word, dword dword all indirizzo 192 Ogni locazione: 8 cifre binarie (1 byte) indirizzi byte all indirizzo 188 byte all indirizzo i 186 Il byte di ordine più basso nella locazione specificata Il byte d ord ne p ù basso nella locaz one spec f cata dall indirizzo gli altri alle locazioni consecutive
Bus dei dati dell 8086 Locazione di memoria: 1 byte Bus dati: almeno a 8 linee (8088) Una per la trasmissione di ogni bit numeri rappresentati da almeno 16 bit (alcuni programmi che effettuano calcoli possono riciederli) Bus a 8 linee: Due operazioni separate (per memorizzarli) 8086 ha maggiore potenza Nell 8086 Bus dei dati a 16 linee
Dimensione del bus degli indirizzi i i nella famiglia dell 8086 Il numero di bit che possono viaggiare i sul bus di indirizzi determina il numero massimo di memoria indirizzabile / locazioni di IO Con n linee di bus il processore può indirizzare 2 n indirizzi univoci (poiché ci sono 2 n valori in un numero binario ad n bit.
Bus degli indirizzi nell 8086 L 8086 consente indirizzi di memoria a 20 bit (inviati sul bus degli indirizzi) Numero di Indirizzi = 2 20 = 1.048.576 = 1.024 K Locazioni dalla 0000 0000 0000 0000 0000 (0D 0H) alla 1111 1111 1111 1111 1111 (1 048 575D - FFFFH) Anche le istruzioni sono in memoria (programma in codice macchina) 6 byte (max) per ogni istruzione nell 8086 Es: controlla se il valore in locazione 20BAFH è 365 ~ 300istr. (256 = 2 8 ) 2 byte per il nome dell istruzione 2 byte per rappresentare 365 (unsigned a 16 bit) Indirizzi a 20 bit 3 byte per 20BAFH TOTALE 7 Byte!!! NON CONSENTITO!!!?
Segmentazione dell 8086 (1) La memoria può essere pensata come organizzata in segmenti (entità logiche di cui il programmatore è consapevole) segmento1 segmento2 segmento3 64 k 2 16 locazioni di memoria segmento4 Cella di memoria selezionata Rappresentazione degli indirizzi <indirizzo del segmento>:<offset>
Segmentazione 8086(2) Calcolo degli indirizzi fisici da immettere sul bus degli indirizzi + 16 bit Indirizzo effettivo in (o offset) Reg. puntatore BX 16 bit 0000 Indirizzo di segmento * 16 = (shift di 4 posizioni) 20 bit Indirizzo fisico un esempio (in esadecimale) Indirizzo: <segmento>:<offset> 020A:1BCD Indirizzo i effettivo 1 B C D H Shift 0 2 0 A 0 H -------------------------------------- Indirizzo fisico 0 3 C 6 D H
Bus degli indirizzi nell 8086 L 8086 consente indirizzi di memoria a 20 bit (inviati sul bus degli indirizzi) Numero di Indirizzi = 2 20 = 1.048.576 = 1.024 K Locazioni dalla 0000 0000 0000 0000 0000 (0D 0H) alla 1111 1111 1111 1111 1111 (1 048 575D - FFFFH) Segmentazione della memoria Anche le istruzioni Per sono indirizzare memoria (programma in codice 2 20 locazioni macchina) 6 byte (max) per ogni di istruzione memoria nell 8086 bastano 2 byte Es: controlla se il valore in locazione 20BAFH è 365 ~ 300istr. (256 = 2 8 ) 2 byte per il nome dell istruzione 2 byte per rappresentare 365 (unsigned a 16 bit) Indirizzi a 20 bit 3 byte per 20BAFH TOTALE 7 Byte!!! NON CONSENTITO!!!?
Architettura interna della CPU 8086 E costituita da due blocchi funzionali
Bus Interface Unit Fornisce l interfaccia fisica tra il mondo esterno e la CPU. Coda delle istruzioni Struttura FIFO (6 byte): accumula le istruzioni da eseguire (pre-fetching) Gestisce tutte tt le operazioni i da e per l esterno 1. Fetch delle istruzioni 2. Spezzettamento nelle sue parti costituenti 3. Lettura e scrittura operandi e risultati delle istruzioni 4. Calcola gli indirizzi fisici (a 20 bit) 5. Accodamento delle istruzioni (prefetch)
Execution Unit Provvede alla esecuzione delle istruzioni 1. Riceve le istruzioni dalla BIU (byte per byte) 2. Decodifica delle istruzioni 3. Genera gli indirizzi degli operandi (se esistono) 4. Testa ed aggiorna il flag
Decodifica delle istruzioni Istruzioni non della forma SUB QuestoDato DaQuestoDato SistemaIlRisultatoQui piuttosto 0010101111000011 (16 bit) Set di istruzioni dell 8086 almeno 300 istruzioni diverse Richiesti 2 byte (2 8 =256 un byte non basta) per il nome dell istruzione + byte per gli operandi (se esistono) Coda di pre-fetching struttura a sei byte 6 byte per rappresentare una istruzione
Architettura interna della CPU 8086 E costituita da due blocchi funzionali EU e BUI lavorano in parallelo (pipeline 8086) Durante la fase di decodifica (EU) i bus sono inattivi e la BIU ricerca e preleva l istruzione successiva dalla memoria. (con priorità sugli operandi dell istruzione già recuperata)
Pipeline 8086 fetch execute fetch execute fetch execute fetch execute BIU EU
Pipeline 8086 fetch execute fetch execute fetch execute fetch execute BIU fetch EU attendi
Pipeline 8086 fetch execute fetch execute fetch execute fetch execute BIU fetch fetch EU attendi execute
Pipeline 8086 fetch execute fetch execute fetch execute fetch execute BIU fetch fetch fetch EU attendi execute execute
Pipeline 8086 fetch execute fetch execute fetch execute fetch execute BIU fetch fetch fetch EU attendi execute execute Questa istruzione fa una richiesta di dati che non sono nella coda
Pipeline 8086 fetch execute fetch execute fetch execute fetch execute BIU fetch fetch fetch fetch EU attendi execute execute attendi Questa istruzione fa una richiesta di dati che non sono nella coda
Pipeline 8086 fetch execute fetch execute fetch execute fetch execute BIU fetch fetch fetch fetch Legge dati EU attendi execute execute attendi Questa istruzione fa una richiesta di dati che non sono nella coda
Pipeline 8086 fetch execute fetch execute fetch execute fetch execute BIU fetch fetch fetch fetch Legge dati fetch EU attendi execute execute attendi execute Questa istruzione fa una richiesta di dati che non sono nella coda
Pipeline 8086 fetch execute fetch execute fetch execute fetch execute Questi bit vengono scaricati Perché? BIU fetch fetch fetch fetch Legge dati fetch EU attendi execute execute attendi execute Questa istruzione fa una richiesta di dati che non sono nella coda
Pipeline 8086 fetch execute fetch execute fetch execute fetch execute Questi bit vengono scaricati (Perché?) BIU fetch fetch fetch fetch Legge dati fetch fetch EU attendi execute execute attendi execute execute Questa istruzione fa una richiesta di dati che non sono nella coda
Pipeline 8086 fetch execute fetch execute fetch execute fetch execute Questi bit vengono scaricati (Perché?) BIU fetch fetch fetch fetch Legge dati fetch fetch fetch EU attendi execute execute attendi execute execute execute Questa istruzione fa una richiesta di dati che non sono nella coda
Pipeline 8086 fetch execute fetch execute fetch execute fetch execute Questi bit vengono scaricati (Perché?) BIU fetch fetch fetch fetch Legge dati fetch fetch fetch EU attendi execute execute attendi execute execute execute Questa istruzione fa una richiesta di dati che non sono nella coda Istruzione di salto
Pipeline 8086 fetch execute fetch execute fetch execute fetch execute Questi bit vengono scaricati (Perché?) BIU fetch Legge dati fetch fetch fetch EU attendi execute execute execute Istruzione di salto Focus spostato
Pipeline 8086 fetch execute fetch execute fetch execute fetch execute Questi bit vengono scaricati (Perché?) BIU fetch Legge dati fetch fetch fetch fetch EU attendi execute execute execute attendi Istruzione di salto
Pipeline 8086 fetch execute fetch execute fetch execute fetch execute Questi bit vengono scaricati (Perché?) BIU fetch Legge dati fetch fetch fetch fetch fetch EU attendi execute execute execute attendi execute Istruzione di salto
Pipeline 8086 fetch execute fetch execute fetch execute fetch execute Questi bit vengono scaricati (Perché?) BIU fetch Legge dati fetch fetch fetch fetch fetch EU attendi execute execute execute attendi execute Istruzione di salto
Registri Registri di segmento Registri di sistema Registri generali Registri puntatore
Uso generale Registri Generali Per memorizzare operandi e risultato di operazioni i Bit ---------- 16 ------------- AH BH CH DH AX BX CX DX AL BL CL DL Accumulatore nelle op aritmetiche Nei modi di indirizzamento a memoria Contatore delle iterazioni nei Loop Ampiamento di AX nell moltipl. E divis. Di dati a 16 bit
Registri Indici e Puntatori registri indici e puntatori SI: Indice di sorgente DI: indice di destinazione i BP: Puntatore alla Base SP: Puntatore allo Stack (si somma a SS per ottenere il TOP)
Registri di Sistema registri di sistema IP: Puntatore Istruzioni FLAGS: Flag di stato
FLAGS Registro a 16 bit contenente: -6 flag di stato: vengono modificati dall'eu in base al risultato delle operazioni logiche e aritmetiche -3 flag di controllo: settati o azzerati dal programma al fine di modificare il comportamento della CPU I rimanenti bit non sono utilizzati SF: segno (+ o -) ZF: risultato Zero OF: Overflow CF: Carry AF: Ausiliary carry PF: Parità del risultato - IF: Abilitazione Interrupt - DF: Direction -TF: Trap Esiste un gruppo di istruzioni che permette al programma di controllare il contenuto di tali flag a fini decisionali
Registri di Segmento Per costruire indirizzi fisici (da mettere sul bus degli indirizzi) i i) con i quali accedere alla memoria registri segmento CS: Segmento Codice (si somma a IP per ottenere il PC) DS: Segmento Dati SS: Segmento Stack ES: Segmento Extra Contengono il puntatore all inizio dei segmenti di codice, di dato, di stack e supplementare
Segmentazione 8086 (3)
Il linguaggio gg Assembly Qualsiasi linguaggio assembly contiene 1. It Istruzioni i per il TRASFERIMENTO DATI 2. Istruzioni per l ESECUZIONE DI OPERAZIONI ARITMETICHE SU INTERI 3. Istruzioni per l ESECUZIONE DI OPERAZIONI LOGICHE SULL INTERO DATO O SU SINGOLI BIT 4. Istruzioni per MODIFICARE LA SEQUENZA DI ESECUZIONE di un programma
Il linguaggio gg Assembly Istruzioni per migliorare la potenza del processore 1. Istruzioni i per l ESECUZIONE DI OPERAZIONI IN VIRGOLA MOBILE 2. Istruzioni per la gestione di STRINGHE DI CARATTERI 3. Istruzioni per la gestione dell INPUT/OUTPUT