Calcolatori elettronici/Informazioni generali
Modi di indirizzamento
[modifica | modifica sorgente]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 | modifica sorgente]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 sorgente]- 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 | modifica sorgente]- ↑ Il sistema operativo deciderà in fase di esecuzione dove collocare il segmento dati all'interno della memoria.