Calcolatori elettronici/Informazioni generali

Wikibooks, manuali e libri di testo liberi.
Jump to navigation Jump to search
CopertinaCalcolatori elettronici/Copertina
  1. L'evoluzione dei sistemi di elaborazioneCalcolatori elettronici/L'evoluzione dei sistemi di elaborazione
  2. Il progetto di circuiti logiciCalcolatori elettronici/Il progetto di circuiti logici
  3. I processoriCalcolatori elettronici/I processori
  4. Architettura 8086Calcolatori elettronici/Architettura 8086
  5. Unità di controlloCalcolatori elettronici/Unità di controllo
  6. Introduzione alle memorieCalcolatori elettronici/Introduzione alle memorie
  7. Le memorie ad accesso casualeCalcolatori elettronici/Le memorie ad accesso casuale
  8. Le memorie cacheCalcolatori elettronici/Le memorie cache
  9. Le memorie ad accesso serialeCalcolatori elettronici/Le memorie ad accesso seriale
  10. La memoria virtualeCalcolatori elettronici/La memoria virtuale
  11. La gestione dei dispositivi input/outputCalcolatori elettronici/La gestione dei dispositivi input/output
  12. Intel 8255Calcolatori elettronici/Intel 8255
  13. Intel 8259Calcolatori elettronici/Intel 8259
  14. I busCalcolatori elettronici/I bus
  15. Le architetture a pipelineCalcolatori elettronici/Le architetture a pipeline
  16. Assembler 8086
IntroduzioneCalcolatori elettronici/Introduzione
  1. Informazioni generaliCalcolatori elettronici/Informazioni generali
  2. Istruzioni di trasferimento datiCalcolatori elettronici/Istruzioni di trasferimento dati
  3. Istruzioni aritmeticheCalcolatori elettronici/Istruzioni aritmetiche
  4. Istruzioni per il controllo del flussoCalcolatori elettronici/Istruzioni per il controllo del flusso
  5. Istruzioni per la manipolazione dei bitCalcolatori elettronici/Istruzioni per la manipolazione dei bit
  6. Le procedureCalcolatori elettronici/Le procedure
  7. Istruzioni per il controllo del processoreCalcolatori elettronici/Istruzioni per il controllo del processore
  8. Formato delle istruzioni macchina, tempi di esecuzioneCalcolatori elettronici/Formato delle istruzioni macchina, tempi di esecuzione

Modi di indirizzamento[modifica]

Esistono 7 modi di indirizzamento che definiscono come gli operandi possono essere passati. L'assembler 8086 non è un linguaggio ortogonale, ma impone dei vincoli sui modi di indirizzamento nei confronti delle istruzioni: ad esempio, l'istruzione <MOV [DI] [SI] è vietata perché gli operandi [DI] e [SI] si trovano entrambi in memoria.

Register addressing (AX, BX)

Gli operandi sono registri che contengono dati.

Immediate addressing (7, 07h, OFFSET VAR, LENGTH VETT)

Gli operandi sono delle costanti, cioè sono memorizzati direttamente all'interno del codice macchina dell'istruzione → il valore massimo è limitato dalla dimensione dell'istruzione. Parole chiave come OFFSET e LENGTH non fanno parte dell'instruction set del processore; gli operandi che le contengono vengono automaticamente convertiti dall'assemblatore in indirizzi costanti.

Direct addressing (VAR, TABLE+2, TABLE[2])

Gli operandi sono offset di memoria, passati indirettamente tramite i nomi simbolici delle variabili: è compito dell'assemblatore in fase di compilazione, dopo aver assegnato a ogni variabile il proprio offset rispetto al principio del segmento dati[1], convertire il nome simbolico nel suo offset.

Register indirect addressing ([BX], [DI], [SI])

Gli operandi sono offset di memoria, passati indirettamente tramite nomi di registri racchiusi tra parentesi quadre. Incrementando di volta in volta il contenuto di un registro, è possibile scandire tutta la memoria.

Base relative addressing ([BX]+4, 4[BX], [BX+4])

Gli operandi sono dati dalla somma tra una costante e un valore recuperato al tempo di esecuzione.

Directed indexed addressing (VETT[DI])

Gli operandi sono variabili il cui offset viene sommato, al tempo di esecuzione, all'indice. È molto usato per la scansione di vettori.

Base indexed addressing (TABLE[DI][BX]+6)

Gli operandi sono variabili il cui offset viene opportunamente sommato a due indici e facoltativamente a una costante.

Gli indici non funzionano come in C, ma si deve specificare l'offset di un elemento tenendo conto dell'effettivo numero di bit di cui sono composti gli operandi precedenti: <riga>*<numero_colonne>*<lunghezza_word>+<colonna>*<lunghezza_word>

Pseudo-istruzioni[modifica]

Le pseudo-istruzioni non si trasformano in codice macchina che verrà eseguito dal processore, ma sono solo delle direttive per l'assemblatore.

Definizione di variabili (DB, DW, DD)

Per definire un vettore si può utilizzare l'istruzione DUP:

<nome> <tipo> <lunghezza_in_byte> DUP <valore_di_inizializzazione|?>

DB può essere utilizzato anche per memorizzare caratteri, dichiarati tra virgolette. Non esiste il carattere di terminazione '\0'.

Gestione dei segmenti (.MODEL, .DATA, .CODE, .STACK)

A seconda delle esigenze di memoria, è possibile specificare all'assemblatore quale modello di memoria (es. small) richiede il programma, cioè il numero di segmenti di memoria e la loro dimensione.

Operatori[modifica]

Modifica del tipo di una variabile (PTR)

Anteponendo <tipo> PTR al nome di una variabile, si specifica la lunghezza di un operando da leggere in memoria, per rimuovere le ambiguità (è l'analogo del cast nel C).

Note[modifica]

  1. Il sistema operativo deciderà in fase di esecuzione dove collocare il segmento dati all'interno della memoria.