Calcolatori elettronici/Informazioni generali

Indice del libro

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).

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