Dispensa Linguaggio Assembly
Dispensa Linguaggio Assembly
Dispensa Linguaggio Assembly
LINGUAGGIO
ASSEMBLY
ANNO SCOLASTICO
2013 2014
PROF. RANALLI LORIS
LINGUAGGIO ASSEMBLY PROF. RANALLI LORIS
In questo capitolo vedremo quali sono le direttive che vengono usate per
definire i vari segmenti.
2
LINGUAGGIO ASSEMBLY PROF. RANALLI LORIS
stack segment
; eventuale inizializzazione della pila
ends
3
LINGUAGGIO ASSEMBLY PROF. RANALLI LORIS
Dato pu essere:
- Un numero (56, 0F3h )
- un carattere indicato tra apici ('A')
- ? --> quando non si vuole inizializzare la variabile
Esempi:
Dati segment
zero DB 0
esa DW 1234ABCD h
non_ini DB ?
ends
4
LINGUAGGIO ASSEMBLY PROF. RANALLI LORIS
5
LINGUAGGIO ASSEMBLY PROF. RANALLI LORIS
1.4 Istruzioni
Quando si scrivono le istruzioni occorre rispettare le seguenti regole:
- nelle istruzioni con due operandi (dest, sorg), i due operandi non
possono essere contemporaneamente locazioni di memoria: (reg-
mem, mem-reg, reg-reg, reg-costante, mem-costante)
- una costante non pu essere mai l'operando di destinazione
- Per indicare una locazione di memoria si pone l'indirizzo tra
parentesi quadre ( [ind]).
- Gli operandi sorg e dest devono avere la stessa dimensione.
- Istruzione MOV
MOV dest, sorg
Equivale alloperazione = (assegnamento):
dest = sorg
dest e sorg possono essere:
- registri : ax, ... , dx di, si, ...
- memoria: indirizzo di memoria
sorg pu essere anche una costante
dest e sorg non possono essere entrambi indirizzi di memoria
dest non pu mai essere il registro CS
alcuni esempi:
- registro registro
MOV AX,BX
MOV CX,DX
- registro costante
MOV AX,123
MOV CX,0ff3h
- registro - memoria
MOV AX, var1
MOV BX, [CX] Il registro CX contiene un indirizzo di memoria
- memoria registro
MOV var1, AX
MOV [CX],BX Il registro CX contiene un indirizzo di memoria
6
LINGUAGGIO ASSEMBLY PROF. RANALLI LORIS
- Metodi di indirizzamento
I metodi di indirizzamento sono sistemi di accesso agli operandi di
un'istruzione.
Esistono quattro tipi di indirizzamento (gli esempi verranno fatti tramite
l'utilizzo dell'unica istruzione vista):
- Indirizzamento immediato: si ha quando l'operando una costante
numerica (l'operando pu essere una costante solo se l'operando
sorgente).
MOV AX,123 --> Qui si ha un indirizzamento
immediato, 123 l'operando
immediato.
7
LINGUAGGIO ASSEMBLY PROF. RANALLI LORIS
il contenuto dei due operandi viene scambiato dest assume il valore di sorg e
viceversa.
es.
prima di XCHG dest,sorg dest=5 sorg=123
dopo XCHG dest,sorg dest=123 sorg=5
Per questa istruzione gli operandi non possono essere immediati.
8
LINGUAGGIO ASSEMBLY PROF. RANALLI LORIS
Calcola l'AND logico bit a bit tra dest e sorg ponendo il risultato in dest.
esempio:
prima di AND dest,sorg dest=0110B
sorg=0101B
OR dest,sorg
Calcola l'OR logico bit a bit tra dest e sorg ponendo il risultato in dest.
esempio:
prima di OR dest,sorg dest=0110B
sorg=0101B
NOT dest
XOR dest,sorg
Calcola lo XOR logico bit a bit tra dest e sorg ponendo il risultato in dest.
Questa istruzione viene utilizzata di solito per azzerare il contenuto di un
registro.
esempio:
prima di XOR dest,sorg dest=0110B
sorg=0101B
9
LINGUAGGIO ASSEMBLY PROF. RANALLI LORIS
Esercizio 1
Dato il valore 38, impostare a 0 il bit di peso 2
(38)10=(100110)2
il bit di peso 2 il seguente
100110
quindi tale bit lo si pu indicare come 000100 = (4)10
ovvero 22 (bit di peso 2). Il numero che individua la
posizione di un bit chiamato maschera.
Quindi per azzerare tale bit si pu ragionare in questa
maniera:
prendo la maschera 000100 la inverto con una operazione
not --> 111011. Effettua un operazione AND tra il numero
38 e la maschera invertita:
100110 AND
111011
------
100010
(il bit di peso due azzerato)
Come si scrive tutto ci in assembler?
;segmenti
start:
MOV AL,38
MOV AH,4
NOT AH
AND AH,AL
MOV AX,4C00h
INT 21h
ENDS
END start
10
LINGUAGGIO ASSEMBLY PROF. RANALLI LORIS
11
LINGUAGGIO ASSEMBLY PROF. RANALLI LORIS
esempio
ADD byte ptr [BX],12
ADD byte ptr [BX], 300 --> in questo caso il compilatore
segnala lerrore, infatti i
due operando non hanno
la stessa dimensione
(8 bit, 16 bit).
Listruzione DIV viene utilizzata per effettuare una divisione tra numeri
naturali. Se divisore un numero a 8 bit effettua la divisione tra AX e
l'operando divisore. Il quoziente della divisione viene collocato nel registro
AL ed il resto nel registro AH
AX / divisore --> AL=Q AH=R
13
LINGUAGGIO ASSEMBLY PROF. RANALLI LORIS
- Istruzione LEA
LEA reg,var
Esempio
Data segment
Var1 DB 35 ;supponiamo che var1 sia
;posizionata allindirizzo 130h
end segment
LEA SI,variabile ;in SI viene inserito 130h (indirizzo
;della variabile var1)
14
LINGUAGGIO ASSEMBLY PROF. RANALLI LORIS
Listruzione CMP viene utilizzata per effettuare un confronto tra op1 e op2, il
risultato dell'istruzione la modifica di alcuni flag del registro dei flag. In
realt, l'istruzione CMP non fa altro che una sottrazione tra op1 e op2:
op1 - op2 --> se il risultato negativo allora op2>op1 quindi viene
settato CF=1 (si ha una richiesta di prestito dal bit pi
significativo) altrimenti op1>=op2
Se op1=op2 allora il risultato della sottrazione sar zero
per cui sar settato ZF=1 (l'ultima istruzione ha prodotto
un risultato uguale a zero), se op1!=op2 --> ZF=0.
Riassumendo:
CMP op1,op2
op1>op2 --> CF=0 ZF=0
op2<op2 --> CF=1 ZF=0
op1=op2 --> CF=? ZF=1
op1!=op2 --> CF=? ZF=0
op1>=op2 --> CF=0 ZF=?
op1<=op2 --> CF=1 ZF=?
op1 pu essere: reg, imm, mem
op2 pu essere: reg, imm, mem
L'istruzione CMP non modifica in nessun caso op1 e op2, op1 e op2 devono
avere la stessa dimensione.
- JMP: istruzione di salto incondizionato
JMP etichetta
JMP indirizzo_istruzione
Esempio 2
start:
...
JMP CS:120 ;Salta all'istruzione che si trova all'offset
120 (si suppone sial'offset dell'etichetta
fine)
...
fine: MOV AX,4c00h
INT 21h
ends
end start
JL op1<op2
<
(Less) (per numeri interi)
JGE op1>=op2
>=
(Greater or Equal) (per numeri interi)
JLE op1<=op2
<=
(Less or Equal) (per numeri interi)
17
LINGUAGGIO ASSEMBLY PROF. RANALLI LORIS
- IF-ELSE
Il costrutto IF-ELSE si realizza attraverso lutilizzo della coppia di istruzioni
CMP, J* e JMP:
18
LINGUAGGIO ASSEMBLY PROF. RANALLI LORIS
start:
...
MOV AX,A
MOV BX,B
CMP AX,BX
JA if
else: ;istruzioni else
JMP continua
if: ;istruzioni if
continua:
MOV AX,4C00H
INT 21h
ENDS
END start
- CICLO DO-WHILE
Il costrutto DO-WHILE si realizza attraverso lutilizzo della coppia di
istruzioni CMP, J* :
JA ciclo
start: ;ripeti ciclo
... ;finch op1>op2
ciclo: ... ;istruzioni fine ciclo:
;ciclo ...
CMP op1,op2 MOV AX,4C00h
INT 21h
ENDS
END
- CICLO WHILE
Il costrutto WHILE si realizza attraverso lutilizzo della coppia di istruzioni
CMP, J* :
start:
... JMP inizio_ciclo
inizio_ciclo: fine ciclo:
CMP op1,op2 ...
JA fine ciclo MOV AX,4C00h
;se op1>op2 esci INT 21h
;dal ciclo ENDS
... END
;istruzioni ciclo
19
LINGUAGGIO ASSEMBLY PROF. RANALLI LORIS
- CICLO FOR
Il costrutto FOR si realizza attraverso lutilizzo della coppia di istruzioni CMP,
J* :
- Istruzione loop
MOV CX,num_ripetizioni
indirizzo: ...
...
LOOP indirizzo ;decrementa CX e
;controlla CX!=0
Listruzione loop permette di eseguire ciclicamente il codice racchiuso tra un
punto del codice e listruzione loop, ad ogni esecuzione loop decrementa il
contenuto di CX e controlla che CX sia diverso da zero. Lesecuzione ciclica
termina quando CX uguale a 0.
INT num_int
Le interruzione si distinguono in:
Interruzioni hardware (id: da 0h a Fh): sono interruzioni che
non sono richieste dal programmatore ma dalla CPU quando c un
eccezione oppure dal dispositivo di I/O associato a allinterruzione
richiesta.
Interruzioni software del BIOS (id: da 10h a 1Fh) e di
MSDOS (id: da 20h a 2Fh): sono le funzioni API descritte prima.
Le interruzioni da 30h a 3Fh non sono documentate, invece quelle da 40h a
FFh sono disponibili al programmatore per creare delle interruzioni software
proprie.
Cosa succede quando viene inviata una richiesta di interruzione?
INT num_int
Il sistema interrompe lesecuzione del programma attualmente in esecuzione
(che ha invocato un istruzione INT) accede, in memoria, ad una tabella
chiamata IDT (Interrupt Descriptor Table) contenente i descrittori delle 256
interruzioni. La tabella in realt un array di 256 elementi, ogni elemento ha
dimensione 4 Byte contiene al suo interno CS e IP della funzione richiesta
(chiamata anche sottoprogramma o subroutine). Il sistema calcola lindirizzo
assoluto dellelemento della tabella da selezionare: num_int*4, preleva i 4
Byte dellelemento e li posiziona allinterno dei registri CS:IP e restituisce il
controllo del processore alla funzione richiesta. Terminata lesecuzione della
funzione di interruzione il controllo del processore viene restituito al
programma che era stato bloccato, viene reimpostato il vecchio valore di CS e in
IP viene inserito lidentificativo dellistruzione successiva allistruzione INT
appena eseguita.
Esempio
Supponiamo di voler stampare a video il carattere A (codice ASCII 41h)
MOV AL,41h
MOV AH,0Eh
INT 10h
22
LINGUAGGIO ASSEMBLY PROF. RANALLI LORIS
Esempio
Supponiamo di voler acquisire il carattere A (codice ASCII 41h)
MOV AH,00h
INT 16h ;il programma si blocca in attesa di un
;carattere, premo A. Il programma torna
;in esecuzione e in AL contenuto il
;codice ASCII di A
Esempio
Supponiamo di voler stampare a video il carattere A (codice ASCII 41h)
MOV DL,41h
MOV AH,02h
INT 21h
Acquisizione di un Carattere
MOV AH,01h
INT 21h ;il programma si blocca in attesa di un
;carattere, premo A. Il programma torna
;in esecuzione e in AL contenuto il
;codice ASCII di A
23
LINGUAGGIO ASSEMBLY PROF. RANALLI LORIS
ends
end start
Es.2
Dato un array di 10 elementi, realizzare un programma in assembly che
incrementi di uno il valore di ogni elemento dellarray
Data Segment
A DB 10,5,3,11,6,77,9,6,0,12
ends
Code Segment
assume DS:Data
assume CS:Code
start:
MOV AX,Data ;Inizializzazione del registro
MOV DS,AX ;Dati con lindirizzo del Segmento
STRINGHE
In un calcolatore ogni carattere codificato secondo un opportuna codifica,
quella pi utilizzata e la codifica ASCII. Le stringhe sono un insieme di
caratteri contigui, in assembler le possiamo rappresentare come array di
caratteri ASCII. Ogni carattere codificato attraverso 8 bit, quindi larray
deve essere un array di byte. Come si definisce un array di byte? Lo si
definisce attraverso il formato AsciiZ (ASCII Zero Terminated), ovvero ogni
stringa termina con il valore 0 (lultimo elemento dellarray di caratteri della
stringa deve essere 0). La definizione della stringa nel segmento dati pu
essere fatta nel seguente modo :
Str DB Ciao,0 ;0 carattere di fine stringa
25
LINGUAGGIO ASSEMBLY PROF. RANALLI LORIS
26
LINGUAGGIO ASSEMBLY PROF. RANALLI LORIS
Esempio 1
Data la stringa definita qui sopra settare ad 1 il registro CL se tale stringa
inizia con la lettera C altrimenti inserire in CL il primo carattere della
stringa.
...
Code segment
assume CS:Code
assume DS:Data
assume ES:Data
start:
MOV AX,Data ;INIZIALIZZO IL REGISTRO DS
MOV DS,AX
SAR op,n_pos
Scorre verso destra i bit di op tante volte quanto vale n_pos. Ogni bit che
esce a destra viene inserito nel CF e ogni bit che entra a sinistra vale 0.
Terminata lesecuzione dellistruzione CF contiene lultimo bit uscito a
destra.
27
LINGUAGGIO ASSEMBLY PROF. RANALLI LORIS
Esempio
Sequenza scorrimenti:
CF
0 1 0 0 0 1 1 0 1 ?
0 0 1 0 0 0 1 1 0 1
0 0 0 1 0 0 0 1 1 0
0 0 0 0 1 0 0 0 1 1
Loperazione SAR equivale alla divisione per 2 n_pos, nel nostro esempio
141/23=141/8=17
SAR op,n_pos
Esempio
Sequenza scorrimenti:
? 0 0 0 0 1 1 0 1 0
0 0 0 0 1 1 0 1 0 0
0 0 0 1 1 0 1 0 0 0
0 0 1 1 0 1 0 0 0 0
Loperazione SAL equivale alla divisione per 2 n_pos, nel nostro esempio
13*23=13*8=104.
28
INDICE