1. Sistemi a Microprocessore Formato istruzioni e direttive
Sistemi a Microprocessore
ASSEMBLER 8086:
FORMATO ISTRUZIONI E
DIRETTIVE
1
Formato delle istruzioni
Il formato delle istruzioni è il seguente:
[label] istruzione/direttiva [operando/i] [; commento]
• label consente di dare un nome simbolico (da
utilizzare come operando in altre istruzioni) a
variabili di memoria, valori, singole istruzioni,
procedure
• istruzione/direttiva è il mnemonico per
un’istruzione eseguibile o una direttiva; individua
il tipo di operazione da eseguire e il numero e il
tipo degli operandi
2
Sergio PORCU 1
2. Sistemi a Microprocessore Formato istruzioni e direttive
Formato delle istruzioni
• operando/i è una combinazione di nessuna,
una o più costanti, riferimenti a registri o
riferimenti alla memoria; se un’istruzione
ammette due operandi:
il primo è l’operando destinazione
il secondo è l’operando sorgente
ad esempio, MOV AX, CX copia il contenuto
del registro CX nel registro AX
• commento consente di rendere più
leggibile il programma
3
Formato delle istruzioni
È indifferente l’uso di lettere maiuscole o
minuscole. Il tipo di operandi ammessi
varia da istruzione a istruzione.
Esistono istruzioni che ammettono
come operando solo una costante o
solo un particolare registro generale.
4
Sergio PORCU 2
3. Sistemi a Microprocessore Formato istruzioni e direttive
Nomi simbolici
• Caratteri ammessi per i nomi simbolici:
• A-Z a-z 0-9 _ $ ? @
• Il primo carattere di un nome non può
essere digit (0-9)
• Ogni nome deve essere univoco (in genere,
all’interno del modulo in cui viene definito)
• Non deve coincidere con una parola
riservata (ad esempio, il nome di un registro
o di un operatore)
5
Costanti numeriche
• Di default, tutti i valori numerici sono
espressi in base dieci
• È possibile esprimere le costanti
numeriche:
• in base 16 (esadecimale) mediante il
suffisso H (il primo digit deve essere
numerico)
• in base 8 (ottale) mediante il suffisso O
• in base 2 (binario) mediante il suffisso B
6
Sergio PORCU 3
4. Sistemi a Microprocessore Formato istruzioni e direttive
Costanti numeriche
Ad esempio:
00FFh
0h
777O
11001B
FFh errata!
778O errata!
7
Direttive
Le direttive sono istruzioni di tipo
dichiarativo che forniscono
informazioni agli strumenti di sviluppo
dei programmi. In particolare, alcune di
queste direttive fanno sì che
l’assemblatore generi al loro posto una
serie opportuna di istruzioni; in questo
caso tali direttive sono assimilabili a
macro predefinite.
8
Sergio PORCU 4
5. Sistemi a Microprocessore Formato istruzioni e direttive
Direttive semplificate per la
gestione dei segmenti
• Modelli di memoria
• Creazione dello stack
• Creazione del segmento di dato
• Creazione del segmento di codice
9
Modelli di memoria
La direttiva .MODEL definisce alcuni attributi
che condizionano l’intero modulo ed è
necessaria per abilitare la gestione
semplificata dei segmenti. Deve essere
posta nel file sorgente prima di ogni altra
direttiva di segmento.
Sintassi:
.MODEL modello {, opzione ...}
10
Sergio PORCU 5
6. Sistemi a Microprocessore Formato istruzioni e direttive
Modelli di memoria
I modelli possono essere:
• TINY: il codice e i dati sono in un unico
segmento di 64k byte. Usato nei file COM
• SMALL: un segmento per il codice ed uno
per i dati e lo stack. Entrambi non oltre i 64k
byte
• MEDIUM: il codice usa più segmenti
(superata barriera dei 64k byte). I dati e lo
stack come SMALL
11
Modelli di memoria
• COMPACT: è come SMALL, ma per
accedere ai dati si usano i puntatori FAR
che superano i 64k byte
• LARGE: è come MEDIUM, ma per accedere
ai dati si usano i puntatori FAR che
superano i 64k byte
• FLAT: modalità a 32 bit dei processori
386+. Abolito il metodo SEG:OFFSET,
l’indirizzo è dato da un unico numero a 32
bit
12
Sergio PORCU 6
7. Sistemi a Microprocessore Formato istruzioni e direttive
Creazione dello stack
La direttiva .STACK permette di riservare
uno spazio di memoria per lo stack; il
formato di tale direttiva è il seguente:
.STACK {mem}
Tale direttiva riserva uno spazio di
memoria pari a mem byte. Per default
lo spazio riservato per lo stack è di 1k
byte.
13
Creazione del segmento di
dato
Le direttive .DATA, .DATA?, CONST,
FARDATA, FARDATA? permettono di
creare un segmento di dato. Il loro formato è
il seguente:
.DATA
.DATA?
.CONST
.FARDATA
.FARDATA?
14
Sergio PORCU 7
8. Sistemi a Microprocessore Formato istruzioni e direttive
Creazione del segmento di
codice
La direttiva .CODE permette di definire un
segmento in cui specificare le istruzioni; il
suo formato è il seguente:
.CODE {nome}
La direttiva .CODE definisce un segmento di
codice. Il campo opzionale nome definisce
un eventuale nome da assegnare al
segmento di codice in alternativa a quello di
default.
15
La direttiva ASSUME
La direttiva ASSUME ha il compito di
indicare all’assemblatore a quale
segmento un determinato registro di
segmento sta puntando:
ASSUME segReg:nome [segReg:nome] ...
ASSUME segReg:NOTHING
ASSUME NOTHING
16
Sergio PORCU 8
9. Sistemi a Microprocessore Formato istruzioni e direttive
La direttiva ASSUME
• segReg è il nome di un registro di
segmento (CS, SS, DS, ES)
• nome è il segmento al quale l’assemblatore
assume che segReg punti da questo
momento in poi (sino a una nuova ASSUME
che coinvolga lo stesso registro)
• NOTHING cancella l’associazione tra
registri e segmenti
17
La direttiva ASSUME
L’uso di ASSUME non equivale al
caricamento di un registro di
segmento, ma permette di:
• controllare la validità dei riferimenti alla
memoria
• inserire automaticamente eventuali
prefissi di segmentazione diversi da
quelli di default
18
Sergio PORCU 9
10. Sistemi a Microprocessore Formato istruzioni e direttive
Direttive per la definizione di
procedure
La definizione di ogni procedura deve
iniziare con una direttiva PROC e deve
terminare con una direttiva ENDP. La
direttiva PROC definisce l’inizio di una
procedura:
nome PROC [distanza]
19
Direttive per la definizione di
procedure
• nome è il nome simbolico della
procedura (da utilizzare nelle chiamate
a procedura)
• distanza è:
NEAR – la procedura può essere
chiamata solo all’interno del segmento in
cui è stata definita (default)
FAR – la procedura può essere chiamata
da qualsiasi segmento
20
Sergio PORCU 10
11. Sistemi a Microprocessore Formato istruzioni e direttive
Direttive per la definizione di
procedure
La direttiva ENDP indica la fine di una
procedura:
nome ENDP
• nome è il nome simbolico della
procedura
21
Direttive per la definizione dei
dati
Tali direttive permettono di definire:
• il nome
• il tipo
• il contenuto
delle variabili in memoria.
Il formato è il seguente:
[nome] tipo espressione [, espressione]
22
Sergio PORCU 11
12. Sistemi a Microprocessore Formato istruzioni e direttive
Direttive per la definizione dei
dati
• nome è il nome simbolico del dato
• tipo è la lunghezza del dato (se
scalare) o di ogni elemento del dato
(se array). I tipi più utilizzati sono:
• DB riserva uno o più byte (8 bit)
• DW riserva una o più word (16 bit)
• DD riserva una o più doubleword (32 bit)
23
Direttive per la definizione dei
dati
• espressione è il contenuto iniziale del
dato:
• un’espressione costante
• una stringa di caratteri (solo DB)
• un punto di domanda (nessuna
inizializzazione)
• un’espressione che fornisce un indirizzo
(solo DW e DD)
• un’espressione DUP (duplicata)
24
Sergio PORCU 12
13. Sistemi a Microprocessore Formato istruzioni e direttive
Direttive per la definizione dei
dati - Esempi
ByteVar DB 0 ;1 byte inizializzato a 0
ByteArray DB 1,2,3,4 ;array di 4 byte
String DB ‘8’,’0’,’8’,’6’ ;array di 4 caratteri
String DB ‘8086’ ;equivalente al
;precedente
Titolo DB ‘Titolo’,0dh,0ah
;stringa che contiene
;anche una coppia di
;caratteri CR/LF
25
Direttive per la definizione dei
dati - Esempi
Zeros DB 256 dup (0)
;array di 256 byte
;inizializzati a 0
Tabella DB 50 dup (?)
;array di 50 byte
;non inizializzati
WordVar DW 100*50
;scalare di una
;word
26
Sergio PORCU 13
14. Sistemi a Microprocessore Formato istruzioni e direttive
Direttive per la definizione dei
dati - Esempi
Matrix DW 1,0,0,0,10,0,0,1,0,0,0,1,0,0,0
;array di 16 word
Matrix DW 4 dup(1,3 dup(0))
;equivale al precedente
NearPointer DW Matrix
;contiene l’offset di
;Matrix
27
Direttive per la definizione dei
dati - Esempi
DoubleVar DD ? ;scalare di una doubleword
FarPointer DD Matrix
;contiene l’offset e l’indirizzo
;del segmento di Matrix
28
Sergio PORCU 14
15. Sistemi a Microprocessore Formato istruzioni e direttive
La direttiva EQU
Permette di assegnare un nome simbolico a
una costante:
nome EQU espressione
• nome è il nome simbolico associato alla
costante. Può essere utilizzato ovunque al
posto della costante stessa. Occorre usare
le lettere maiuscole per distinguere le
costanti dalle variabili
• espressione deve fornire un valore
costante
29
La direttiva EQU
CR EQU 0dh ;carattere Carriage Return
LF EQU 0ah ;carattere Line Feed
...
...
Titolo DB ‘Titolo’,CR,LF
;stringa che contiene
;anche una coppia di
;caratteri CR/LF
30
Sergio PORCU 15
16. Sistemi a Microprocessore Formato istruzioni e direttive
La direttiva LABEL
La direttiva LABEL forza un simbolo ad un tipo
specificato:
nome LABEL tipo
Esempio:
words LABEL WORD ;struttura come word
bytes db howmany DUP (?)
...
MOV AX, words ;prima word
31
La direttiva PUBLIC
La direttiva PUBLIC rende accessibili da
altri moduli uno o più simboli:
PUBLIC symbol [, symbol ...]
• symbol è il nome di una variabile o di
una procedura
32
Sergio PORCU 16
17. Sistemi a Microprocessore Formato istruzioni e direttive
La direttiva EXTRN
La direttiva EXTRN rende accessibili uno
o più simboli definiti in un altro modulo:
EXTRN nome:tipo [, nome:tipo ...]
• nome è il nome di un simbolo definiti
PUBLIC in un altro modulo
• tipo è il tipo del simbolo:
BYTE, WORD, ...
NEAR, FAR, ...
33
Operatori
Permettono di formare espressioni complesse
da utilizzare come operandi di istruzioni e
direttive.
L’assemblatore:
• valuta ogni espressione al momento della
traduzione del programma sorgente
• sostituisce il risultato dell’espressione, che
deve essere una costante, all’espressione
stessa
34
Sergio PORCU 17
18. Sistemi a Microprocessore Formato istruzioni e direttive
Priorità degli operatori
• Gli operatori di priorità maggiore
vengono calcolati prima di quelli con
priorità inferiore
• Gli operatori con uguale priorità
vengono calcolati da sinistra a destra
• Eventuali sottoespressioni tra
parentesi vengono calcolate per prime
35
Operatore :
Permette di utilizzare un segmento
diverso da quello di default:
segName:espressione
• segName è il nome di un registro
segmento o di un segmento definito
con la direttiva SEGMENT
• espressione fornisce un offset relativo
al segmento segName
36
Sergio PORCU 18
19. Sistemi a Microprocessore Formato istruzioni e direttive
Operatore SEG
Fornisce l’indirizzo del segmento di
un’espressione:
SEG espressione
• espressione è un riferimento alla
memoria (una label o una variabile)
• SEG restituisce l’indirizzo del
segmento che contiene il riferimento
alla memoria
37
Operatore OFFSET
Fornisce l’offset di un’espressione all’interno di
un segmento:
OFFSET espressione
• espressione è un riferimento alla memoria
(una label o una variabile)
• OFFSET restituisce il numero di byte
dall’inizio del segmento alla locazione della
memoria a cui si riferisce espressione
38
Sergio PORCU 19
20. Sistemi a Microprocessore Formato istruzioni e direttive
Operatore PTR
Cast di un’espressione ad un dato tipo:
tipo PTR espressione
• espressione è un riferimento alla
memoria
• tipo è:
se dati: byte, word, ...
se codice: near, far, ...
39
Operatore SHORT
Informa l’assemblatore che espressione
è distante dalla locazione corrente da -
128 a +127 byte (indirizzo di un byte):
SHORT espressione
• espressione è un riferimento a una
label nel segmento codice corrente
40
Sergio PORCU 20