Sei sulla pagina 1di 59

LAssembler 80x86 LA bl 80 86

Concetti Generali

M. M Rebaudengo M. Sonza Reorda P. Bernardi

Sommario
Introduzione Pseudo-Istruzioni Operatori Modi di Indirizzamento Istruzioni

Sommario
Introduzione Pseudo-Istruzioni Operatori Modi di Indirizzamento Istruzioni

Introduzione
I programmi Assembler sono composti di:
direttive o pseudo-istruzioni: sono comandi per pseudo istruzioni: lassemblatore istruzioni: generano unistruzione macchina. un istruzione macchina

Esempio Direttiva: Di i Istruzione:

VAR1 ADD

DB ? AX, 5 ,

Direttive o Pseudo-Istruzioni
Sono direttive per l'Assemblatore, che non corrispondono a istruzioni macchina nel codice generato Le categorie principali di pseudo istruzioni pseudo-istruzioni sono:
pseudo-istruzioni per la definizione di variabili pseudo-istruzioni per la definizione di costanti pseudo-istruzioni per la gestione dei segmenti.

Istruzioni
label: mnemonico operando, operando ;commento dove label: identifica lindirizzo di partenza di una istruzione operando: in numero variabile da 0 a 2 p mnemonico: identifica una istruzione commento: qualsiasi sequenza di caratteri Esempio lab1: mov ax, 5 ; carico ax

Sommario
Introduzione Pseudo-Istruzioni Operatori Modi di Indirizzamento Istruzioni

Direttive per la Gestione dei Segmenti


Permettono la definizione e la gestione dei segmenti. .MODEL .DATA .CODE .STACK.

Direttiva .MODEL
La direttiva .MODEL definisce gli attributi di base relativi allintero modulo sorgente: all intero
modello di memoria convenzione dei nomi sistema operativo (DOS o WINDOWS) tipo ti di stack. t k

Direttiva .MODEL
Formato .MODEL modello [opzioni, ...] Uso Il modello obbligatorio e definisce le dimensioni dei segmenti di codice e di dato. Le L opzioni possibili sono relative a: i i ibili l ti
convenzioni dei nomi e delle chiamate per procedure proced re e simboli p bblici pubblici tipo di stack.

Modelli di memoria
Il MASM supporta i modelli di memoria standard usati dai linguaggi di alto livello Microsoft. I possibili modelli di memoria sono i seguenti: Default Code Near Near Far Near Far Far Default Data Near Near Near Far Far Far Data e Code Combinati S No No No No No

TINY SMALL MEDIUM COMPACT LARGE HUGE

Creazione dei segmenti di Dato e Codice


La direttiva .DATA crea un segmento di dato La direttiva .CODE crea un segmento di codice La direttiva .STARTUP segnala il punto di STARTUP partenza della funzione principale La direttiva .EXIT segnala il punto di EXIT conclusione della funzione principale La direttiva END segnala il punto di conclusione di un modulo di programma.

Segmento di stack
Nel comando.MODEL possibile specificare il tipo di stack:
NEARSTACK (default): il segmento di stack ed il segmento di dato sono allinterno dello stesso all interno segmento fisico (DS ed SS coincidono). FARSTACK: i segmenti di dato e di stack sono distinti

La direttiva .STACK definisce il segmento di STACK stack.

Esempio
.MODEL small .STACK .DATA DATA vett1 DB 100 DUP (?) .CODE .STARTUP ... MOV AX, 0 ... .EXIT END

Gestione di pi segmenti di Dato


In un modello di memoria che prevede pi segmenti di dato i registri DS ed ES non sono g g S S inizializzati allo startup Tale operazione deve essere fatta dal programmatore.

Esempio
.MODEL small .STACK .DATA segm1 vett1 DB 100 DUP (?) tt1 .DATA segm2 vett2 DB 100 DUP (?) .CODE CODE ASSUME DS:segm1, ES:segm2 .STARTUP MOV AX, segm1 g MOV DS, AX MOV AX, segm2 MOV ES, AX ... .EXIT END

Direttive per la definizione di Costanti


Formato: simbolo EQU espressione simbolo = espressione Definiscono costanti simboliche durante lassemblaggio. Le costanti definite con = possono essere cambiate di valore nel p corso del programma, a differenza di quelle definite con EQU. espressione pu essere unespressione intera, una stringa di 1 o 2 caratteri o un indirizzo caratteri, indirizzo. Esempi column EQU 80 row EQU 25 screen EQU colum*row

Costanti
binarie: 001101B ottali: 15O, 15Q , Q esadecimali: 72H, 0DH, 0BEACH (devono iniziare con un numero) decimali: 13, 13D stringhe: S, Ciao S Ciao reali in base 10: 2.345925, 715E-3

Variabili
Sono utilizzate per identificare in modo simbolico una zona di memoria contenente dati. All atto Allatto della definizione della variabile si variabile, definiscono
il nome la dimensione il valore di inizializzazione (eventualmente).

Identificatori
Sono i nomi che possono essere assegnati a istruzioni, variabili, procedure, costanti, p segmenti Sono cos composti: p
il primo carattere pu essere una lettera (a-z, AZ), oppure uno dei 4 caratteri @ _ $ ? ) gli altri caratteri possono essere una lettera, un numero, o uno dei 4 caratteri sopra

Le parole chiave non possono fungere da identificatori.

Pseduo-istruzioni per la Definizione di Variabili


Formato: [ [nome] direttiva valore ]
direttive: BYTE (DB), WORD (DW), DWORD (DD), QWORD (DQ) ( ) valore pu essere:
un valore numerico una stringa tra apici il carattere ? il costrutto num DUP (val) che replica num volte il h li l valore val.

Direttiva DB
La direttiva L di tti DB permette di d fi i strutture d ti costituite da tt definire t tt dati tit it d byte. utilizzata per la memorizzazione di: p caratteri stringhe numeri interi. interi Esempi: NUM DB ? NUM2 DB 32 CITTA DB "T","o","r","i","n","o" CITTA2 DB "Torino" "T i " STR2 DB 'Programma perfetto !' TAB DB 10 DUP (0) ( ) TAB2 DB 1, 123, 84, 5 DUP (?), -10

Direttiva DW
La direttiva DW permette di definire strutture dati costituite da word (2 byte). utilizzata per la memorizzazione di: 1 o 2 caratteri numeri interi indirizzi di offset. La direttiva DW NON pu essere utilizzata per memorizzare una sequenza di caratteri. q Esempi: TAB DW 1, 350, -4000, 1024 LISTA DB 100 DUP (?) LIST_OFF DW LISTA

Direttiva DD
La direttiva DD permette di definire strutture dati costituite da doubleword (4 byte). utilizzata per la memorizzazione di: 1 o 2 caratteri numeri interi indirizzi interi (registro di segmento e offset). La direttiva DD NON pu essere utilizzata per memorizzare una sequenza di caratteri. q Esempi: TAB DD 125000 LISTA DB 100 DUP (?) LIST_ADD DD LISTA

Direttive DQ e DT
Le direttive DQ e DT permettono di definire dati costituiti da quadword (8 byte) e tenbyte (10 byte). Quadword e tenbyte sono utilizzati per memorizzare numeri di grande precisione per il coprocessore matematico. matematico Una variabile tenbyte pu memorizzare un dato di tipo decimale impaccato secondo il seguente formato:
2 numeri decimali per ogni byte il primo byte memorizza il segno gli altri 9 possono memorizzare fino a 18 cifre decimali.

Sommario
Introduzione Pseudo-Istruzioni Operatori Modi di Indirizzamento Istruzioni

Operatori
Sono direttive per lassemblatore Si distinguono in
operatori per il calcolo degli attributi di una variabile (TYPE, LENGTH, SIZE, SEG, OFFSET) operatori aritmetici p (+, -, *, /, MOD) ope a o che od ca o operatori c e modificano il tipo d u a variabile po di una a ab e (PTR).

Operatore OFFSET
Formato: OFFSET variabile Funzionamento: Loperatore OFFSET restituisce il valore dell'offset di una variabile. Applicazione: Loperatore OFFSET pu essere usato in alternativa allistruzione LEA. LEA Esempio: Le due seguenti istruzioni sono equivalenti: MOV AX, OFFSET VAR LEA AX, VAR

Limiti delloperatore OFFSET


Loperatore OFFSET pu essere applicato solo ad operandi indirizzati direttamente attraverso un nome di variabile e non ad operandi indirizzati indirettamente. p Esempio MOV AX, OFFSET VAR[SI] ;Errore !! Si possono utilizzare l seguenti i t i i tili le ti istruzioni: MOV AX, OFFSET VAR ADD AX, SI oppure: LEA AX, VAR[SI]

Operatori TYPE, LENGTH e SIZE


Formato: TYPE variabile LENGTH variabile SIZE variabile Funzionamento: Loperatore TYPE restituisce il numero di byte delloperando. Loperatore LENGHT restituisce il numero di unit allocate per l operando. loperando Loperatore SIZE restituisce lo spazio di memoria utilizzato dalloperando. SIZE = LENGHT * TYPE

Operatore LENGTH
Loperatore LENGTH ha senso solo per variabili allocate attraverso loperatore DUP. In tutti gli altri casi restituisce infatti il valore 1. Esempio EXP DW 5 DUP (?) EXP2 DW 1, 2, 3, 4, 5 MOV AX, LENGTH EXP MOV BX, TYPE EXP MOV CX, SIZE EXP MOV DX, LENGTH EXP2 Dopo queste istruzioni in AX c 5, in BX c 2, in CX c 10 ed in DX c 1.

Operatore SEG
Formato: SEG variabile Funzionamento: F i t Loperatore SEG restituisce lindirizzo di inizio del segmento a cui appartiene loperando variabile l operando variabile. Esempio: LEA SI, STR MOV AX, SEG STR MOV DS, AX equivalente a: LDS SI, STR

Operatori Aritmetici
aritmetici: +, -, *, /, MOD
Esempio: K EQU .DATA TOT DW .CODE CODE MOV MOV ERRORE GRAVE: MOV

10 ? BH, LENGHT TOT * K TOT, BYTE PTR TOT+1

BH, BH AH * K

Operatore PTR
Formato: tipo PTR nome Funzionamento: Loperatore PTR forza lassemblatore a modificare per l'istruzione corrente il tipo del dato avente come identificatore nome. Esempio: .DATA TOT DW ? .CODE MOV BH, BYTE PTR TOT MOV CH, BYTE PTR TOT+1

Operatore PTR
Esempio COPPIA

(segue)

.DATA DB 2 DUP (?) .CODE MOV AX, COPPIA , MOV AX, WORD PTR COPPIA

; ERRORE!

Esempio INC [BX] La cella da incrementare corrisponde ad una word o ad un byte ? Lassemblatore non pu saperlo e genera errore. Soluzione: S l i INC BYTE PTR [BX]

Sommario
Introduzione Pseudo-Istruzioni Operatori Modi di Indirizzamento Istruzioni

Modi di Indirizzamento
Il Modo di Indirizzamento di una istruzione definisce lo spazio indirizzabile ed il metodo da usarsi per il calcolo dellindirizzo stesso. Gli operandi possono essere contenuti:
in registri nellistruzione stessa in memoria su una porta di I/O.

Modi di Indirizzamento (II)


I Modi di Indirizzamento sono i seguenti:
Register Immediate Direct Register Indirect Base Relative Direct Indexed Base Indexed.

Register Addressing
Nellistruzione specificato il registro da utilizzare come operando.

AX BX
Esempio p

4F02 xxxx

MOV BX, AX AX BX 4F02 4F02

Immediate Addressing
Nellistruzione stessa indicato il dato da usare come operando. Esempio

BH MOV BH, 07h BH

xxxx

07

Note
Loperando pu anche essere un simbolo definito con una pseudo-istruzione EQU.
Esempio E i

EQU : MOV

1024 CX, K

il dato indicato nellistruzione viene trasformato dallassemblatore in formato binario su 8 o 16 bit, e , scritto nel campo opportuno dellistruzione macchina.

Direct Addressing
Nellistruzione contenuto lidentificatore di una variabile, corrispondente allEffective Address della parola di memoria da utilizzare come operando Alla variabile pu essere sommato o sottratto un displacement attraverso gli operatori + e Una notazione equivalente prevede lutilizzo delle p parentesi q quadre p racchiudere il displacement o per p lidentificatore della variabile Lindirizzo fisico ottenuto sommando lEA con il contenuto del Data Segment Register DS. t t d lD t S t R i t DS

Direct Addressing (segue)


Lindirizzo fisico ottenuto sommando lEA con il contenuto del Data Segment Register DS. Formalismo: nome [nome] nome+displacement +di l t nome[displacement] nome-displacement nome[-displacement] Esempi: MOV AX, TABLE MOV AX, TABLE+2 MOV AX, TABLE[2]

Direct Addressing (segue)


Memoria VAR+4
AX

xxxx

VAR+2 VAR

E34F 20FF 0DA3

DS:0024 DS:0022 DS:0020

MOV AX, VAR[4] , [ ]


Memoria VAR+4
AX

E34F

VAR+2 VAR

E34F 20FF 0DA3

DS:0024 DS:0022 DS:0020

Register Indirect Addressing


LEffective Address delloperando contenuto in uno dei seguenti registri:
Base (BX) Index Register ( oppure SI) g (DI ) Base Pointer (BP).

Viene detto Indirect perch nellistruzione indicato p dove trovare lindirizzo delloperando. Esempio MOV AX, [BX]

Registri di segmento
Ciascun registro abbinato ad un particolare registro di segmento: DS BX DS SI DS DI SS BP.

Esempio
Codice per il trasferimento di un vettore in un altro usando il Register Indirect Addressing.
: MOV SI, OFFSET SOURCE_VECT MOV DI, OFFSET DEST_VECT MOV CX, LENGTH SOURCE_VECT MOV AX, [SI] MOV [DI], AX ADD SI, 2 ADD DI, 2 , LOOP QUI :

QUI:

Base Relative Addressing


LEffective Address delloperando calcolato sommando il contenuto di uno dei Base Register (BX o BP) ad un displacement rappresentato da una costante presente nellistruzione stessa. lli t i t Formato assembler: [ <register> ] + <constant> Esempio MOV AX, [BX]+4 Nota MOV AX, [BP]+4 MOV AX, 4[BP] MOV AX, [BP+4] AX sono equivalenti.

Calcolo dellEA per un indirizzamento Base Relative


MOV AX, [BX] + 20
Elemento n-1 ... Elemento 10

spiazzamento 20
... Elemento 2

+
BX 0020

Elemento 1 Elemento 0

DS:0024 0022 DS:0022 DS:0020

Direct Indexed Addressing


LEffective Addressing delloperando calcolato sommando il valore di un offset contenuto in una variabile al contenuto di un displacement contenuto in uno degli Index Register (SI o DI). Formato <variable> [SI] <variable> [DI] Esempio MOV AX, TABLE[DI]

Calcolo dellEA per un indirizzamento Direct Indexed


Memoria MOV AH, VAR[SI]
Elemento n ... Elemento 10 ... Elemento 2

SI

10

DS:0022 DS:0021 DS:0020

+
VAR 0020

Elemento 1 Elemento 0

Esempio
Codice per il trasferimento di un vettore in un altro usando il Direct Indexed Addressing. : MOV MOV QUI: MOV MOV ADD SI, 0 CX, LENGTH SOURCE_VECT AX, SOURCE_VECT [SI] _ DEST_VECT [SI], AX SI, 2

LOOP QUI :

Base Indexed Addressing


LEffective Address delloperando calcolato come somma dei seguenti termini:
contenuto di uno dei Base Register (BX o BP) contenuto di uno degli Index Register (SI o DI) un campo opzionale displacement che pu essere un identificatore di variabile oppure una costante numerica.

Base Indexed Addressing (segue)


Formato <variable> [BX] + [SI] <variable> [BX] + [DI] <variable> [BP] + [SI] <variable> [BP] + [DI] Esempio p MOV AX, TAB[BX][DI]+6

Memorizzazione di una matrice


0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 L 10 M 11 N 12 O 13 P 14 Q
Memorizzazione per righe

0 0 A 1 F 2M

1 B G N

2 C H O

3 D I P

4 E L Q

0 A 1 F 2M 3 B 4 G 5 N 6 C 7 H 8 O 9 D 10 I 11 P 12 E 13 L 14 Q
Memorizzazione per colonne

Calcolo dellEA per un indirizzamento Base Indexed


MOV AH, VAR[BX][SI]
Elemento (m 1,n 1) (m-1,n-1)

...
Elemento (i,n-1)

...
SI BX j
Elemento (i,j)

+
i*n

...
Elemento (i,1) (i 1) Elemento (i,0)

... +
VAR 002A
Elemento (0,n-1) El t (0 1)

...
Elemento (0,1) Elemento (0,0)

DS:002B DS:002A DS 002A

Copia di una riga in una matrice di dati


Specifiche: Date due matrici SORG e DEST di dimensione 4x5, si deve copiare la quarta riga da SORG a DEST DEST. main() { int i; int sorg[4][5], dest[4][5]; ... for (i=0 ; i < 5 ; i++) dest[3][i] = sorg[3][i]; ... }

Soluzione Assembler
RIGHE EQU 4 COLONNE EQU 5 .MODEL small .STACK .DATA SORG DW RIGHE*COLONNE DUP DEST DW RIGHE*COLONNE DUP .CODE CODE MOV BX, COLONNE*3*2 ; MOV SI, 0 ; MOV CX, 5 ; ciclo: MOV AX, SORG[BX][SI] MOV DEST[BX][SI], AX ADD SI, 2 ; LOOP ciclo ; ... ;

(?) (?)

; matrice sorgente ; matrice destinazione

; caricamento in BX del primo elemento della quarta riga inizializzazione del registro SI in CX del numero di colonne

scansione dellindice fine? No => va a ciclo S

Istruzioni
LAssembler 80x86 rende disponibili 92 tipi di istruzioni, raggruppabili nelle seguenti classi:
Trasferimento Dati Aritmetiche Manipolazione di Bit Control Transfer Manipolazione di Stringhe p g Interrupt Handling Process Control.