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.