Le istruzioni assembly x86 sono caratterizzate dalle seguenti caratteristiche:
- Nome simbolico: è una parola chiave riconosciuta dall’assemblatore che individua il tipo di istruzione ed è seguita da nessuno, uno o due operandi.
- Modalità di indirizzamento: la sintassi indicata per i vari metodi di indirizzamento è la seguente:
– immediato a 8/16/32 bit;
– registro a 8/16/32 bit;
– memoria a 8/16/32 bit. - Flag alterati: flag alterati dalle istruzioni.
L’assegnazione con MOV
MOV destinazione,sorgente
L’istruzione MOV possiede due operandi: l’operando di destra viene copiato in quello di sinistra.
L’operando sorgente può essere un valore immediato, un registro o una cella di memoria a cui accedere in modo diretto, indiretto o indicizzato.
L’operando destinazione può essere un registro, una cella di memoria a cui accedere in modo diretto, indiretto o indicizzato ma non un valore immediato. I due operandi devono avere le
stesse dimensioni.
Modalità di indirizzamento:
MOV memoria,registro
MOV registro,memoria
MOV registro,immediato
MOV memoria,immediato
MOV registro,registro
Le variabili in assembly
Le variabili sono i simboli con cui il programmatore fa riferimento ai dati. Gli attributi di una variabilesono:
- l’indirizzo
- il tipo
- la visibilità
Per dichiarare una variabile esistono alcuni tipi primitivi che corrispondono sostanzialmente a quelli offerti direttamente dall’architettura (byte, word, double word). I tipi predefiniti in TASM sono: Byte, Word, DWord.
La sintassi per la dichiarazione di una variabile è la seguente
variabile DB | DW | DDW valore iniziale
dove variabile può essere un nome qualunque lungo al massimo 8 caratteri
esempi:
.DATA
var1 DB 00h
var2 DW ?
LE ISTRUZIONI ARITMETICHE
Istruzione INC
L’istruzione INC incrementa l’operando di 1. L’operando può essere un registro, una cella di memoria indirizzata in modo diretto, indiretto o indicizzato. Negli ultimi due casi è necessario specifi care la dimensione dell’operando che non può essere dedotta dall’istruzione.
Sintassi:
INC operando
Flag alterati:
ZF, SF, OF, PF
Istruzione DEC
L’istruzione DEC funziona in modo inverso all’istruzione INC decrementa di un l’operando
L’addizione ADD
L’istruzione ADD permette di sommare il primo operando con il secondo operando, quindi colloca il risultato nel primo operando. Il precedente contenuto del primo operando viene in questo modo sostituito dalla sua somma con il secondo operando (accumulo) mentre il secondo operando rimane inalterato. Il primo operando può essere un registro, una cella di memoria indirizzata in modo diretto, indiretto o indicizzato; il secondo operando può consistere in un registro, una cella di memoria indirizzata in modo diretto, indiretto o indicizzato o un dato immediato. Anche in questo caso i due operandi devono avere le stesse dimensioni, che possono essere Byte, Word o DWord.
Sintassi:
ADD operando1,operando2
ADD registro,registro
ADD registro,memoria
ADD memoria,registro
ADD registro,immediato
ADD memoria,immediato
Flag alterati:
ZF, CF, SF, OF, PF
Esiste un’istruzione che effettua la somma tra due operandi tenendo conto anche del riporto precedente presente nel Carry fl ag: si tratta di ADC
La sottrazione SUB
L’istruzione SUB effettua una sottrazione tra il secondo e il primo operando copiando il risultato nel primo operando. Il precedente contenuto del primo operando viene quindi sostituito dalla sua sottrazione con il secondo operando mentre il secondo operando rimane inalterato. Il primo operando può essere un registro, una cella di memoria indirizzata in modo diretto, indiretto o indicizzato; il secondo operando può consistere in un registro, una cella di memoria indirizzata in modo diretto, indiretto o indicizzato o un dato immediato. I due operandi devono avere le stesse dimensioni, che possono essere Byte, Word o DWord.
Sintassi:
SUB operando1,operando2
Modalità di indirizzamento:
SUB registro,registro
SUB registro,memoria
SUB registro,immediato
SUB memoria,registro
SUB memoria,immediato
Flag alterati
ZF, CF, SF, OF, PF
La divisione DIV
L’istruzione DIV effettua una divisione ponendo a denominatore l’operando indicato.
Se l’operando è a 8 bit effettua la divisione tra AX e l’operando.
- il quoziente viene collocato nel registro AL
- il resto nel registro AH.
Se l’operando è a 16 bit effettua la divisione tra il numero a 32 bit formato dalla coppia di registri DX:AX e l’operando
- il quoziente viene collocato nel registro AX
- il resto nel registro DX.
I flag CF e OF sono settati se il valore occupa la parte alta del risultato.
Nella versione IDIV viene applicata la regola del segno, cioè se i segni degli operandi sono concordi il risultato è positivo mentre se sono discordi è negativo
Sintassi:
DIV operando
Modalità di indirizzamento:
DIV registro
DIV memoria
Flag alterati:
CF, OF
La moltiplicazione MUL
L’istruzione MUL effettua una moltiplicazione con l’operando
- Se l’operando è a 8 bit viene moltiplicato il registro AL per l’operando il prodotto viene collocato nel registro AX.
- Se l’operando è a 16 bit viene moltiplicato il registro AX per l’operando e il prodotto viene collocato nella coppia di registri DX:AX, dove DX rappresenta i 16 bit più significativi e AX i 16 bit meno significativi del prodotto (32 bit).
- i flag CF e OF sono settati se il valore occupa la parte alta del risultato.
Nella versione IMUL viene applicata la regola del segno, cioè se i segni degli operandi sono concordi il risultato è positivo mentre se sono discordi è negativo.
MUL operando
Flag alterati:
CF, OF
Modalità di indirizzamento:
MUL registro
MUL memoria
Lo scambio XCHG
L’istruzione XCHG (Exchange) possiede due operandi il cui contenuto viene scambiato in un’unica operazione. Per effettuare lo scambio viene usato un registro interno invisibile al programmatore. Gli operandi possono essere rappresentati da un registro, da una cella di memoria con indirizzamento diretto, indiretto o indicizzato ma non da un valore immediato.
Sintassi:
XCHG operando1,operando2
Modalità di indirizzamento:
XCHG registro,registro
XCHG registro,memoria
XCHG memoria,registro
Flag alterati:
nessuno
Lascia un commento