Calcolatori elettronici/Informazioni generali: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nuova pagina: {{Calcolatori elettronici}} ==Modi di indirizzamento== Esistono 7 '''modi di indirizzamento''' che definiscono come gli operandi possono essere passati. L'assembler 8086 non è un '...
 
Gian BOT (discussione | contributi)
m Bot: sostituzione tag obsoleti
 
Riga 1:
{{Calcolatori elettronici}}
==Modi di indirizzamento==
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 <ttcode><MOV [DI] [SI]</ttcode> è vietata perché gli operandi <ttcode>[DI]</ttcode> e <ttcode>[SI]</ttcode> si trovano entrambi in memoria.
 
;Register addressing (<ttcode>AX</ttcode>, <ttcode>BX</ttcode>)
Gli operandi sono '''registri''' che contengono dati.
 
;Immediate addressing (<ttcode>7</ttcode>, <ttcode>07h</ttcode>, <ttcode>OFFSET VAR</ttcode>, <ttcode>LENGTH VETT</ttcode>)
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 <ttcode>OFFSET</ttcode> e <ttcode>LENGTH</ttcode> non fanno parte dell'instruction set del processore; gli operandi che le contengono vengono automaticamente convertiti dall'assemblatore in indirizzi costanti.
 
;Direct addressing (<ttcode>VAR</ttcode>, <ttcode>TABLE+2</ttcode>, <ttcode>TABLE[2]</ttcode>)
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<ref>Il sistema operativo deciderà in fase di esecuzione dove collocare il segmento dati all'interno della memoria.</ref>, convertire il nome simbolico nel suo offset.
 
;Register indirect addressing (<ttcode>[BX]</ttcode>, <ttcode>[DI]</ttcode>, <ttcode>[SI]</ttcode>)
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 (<ttcode>[BX]+4</ttcode>, <ttcode>4[BX]</ttcode>, <ttcode>[BX+4]</ttcode>)
Gli operandi sono dati dalla somma tra una costante e un valore recuperato al tempo di esecuzione.
 
;Directed indexed addressing (<ttcode>VETT[DI]</ttcode>)
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 (<ttcode>TABLE[DI][BX]+6</ttcode>)
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: <ttcode><riga>*<numero_colonne>*<lunghezza_word>+<colonna>*<lunghezza_word></ttcode>
 
==Pseudo-istruzioni==
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 (<ttcode>DB</ttcode>, <ttcode>DW</ttcode>, <ttcode>DD</ttcode>)
Per definire un vettore si può utilizzare l'istruzione <ttcode>DUP</ttcode>:
:<ttcode><nome> <tipo> <lunghezza_in_byte> DUP <valore_di_inizializzazione|?></ttcode>
 
<ttcode>DB</ttcode> può essere utilizzato anche per memorizzare caratteri, dichiarati tra virgolette. Non esiste il carattere di terminazione <ttcode>'\0'</ttcode>.
 
;Gestione dei segmenti (<ttcode>.MODEL</ttcode>, <ttcode>.DATA</ttcode>, <ttcode>.CODE</ttcode>, <ttcode>.STACK</ttcode>)
A seconda delle esigenze di memoria, è possibile specificare all'assemblatore quale modello di memoria (es. <ttcode>small</ttcode>) richiede il programma, cioè il numero di segmenti di memoria e la loro dimensione.
 
==Operatori==
;Modifica del tipo di una variabile (<ttcode>PTR</ttcode>)
Anteponendo <ttcode><tipo> PTR</ttcode> 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==