Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
di Calcolatori Ele2ronici
Davide
Valeriani
davide.valeriani@studen..unipr.it
Di
cosa
parliamo
In
assembly
avete
visto
tu7e
le
principali
istruzioni
di
un
linguaggio
di
programmazione:
- Assegnazione
(a=5)
MOV
AL,
5d
- Somma
(a=a+b)
ADD
AL,BL
- So2razione
(a=a-b)
SUB
AL,BL
- Divisione
(a=a/b)
DIV
BL
- Mol9plicazione
(a=a*b)
MUL
BL
Ma
come
si
fa
a
fare
controllo
di
usso,
ovvero
a
modicare
a
tempo
di
esecuzione
le
istruzioni
da
eseguire?
In
C/C++
siamo
abitua.
a
farlo
con
i
costruJ
IF,
SWITCH,
WHILE,
DO
WHILE,
FOR,
ma
in
assembly?
Controllo
di
usso
in
Assembly
Davide Valeriani
Istruzioni
di
salto
Le
istruzioni
di
salto
modicano
il
contenuto
dellIP,
consentendo
al
programma
di
eseguire
istruzioni
che
si
trovano
altrove
nel
codice,
iden.cate
da
une9che2a.
I
sal.
si
suddividono
in
due
categorie:
Sal.
incondiziona9:
JMP
<nome
e@cheCa>
Sal.
condiziona9:
JE,
JL,
JG,
JNE,
JGE,
JLE,
Le
istruzioni
di
salto
condizionato
sono
precedute
dallistruzione
di
confronto
(compare)
CMP
op1,
op2
che
confronta
op1
con
op2
e
imposta
opportuni
ag.
Controllo
di
usso
in
Assembly
Davide Valeriani
Costru2o
IF/THEN/ELSE
Tramite
le
istruzioni
di
salto
possibile
implementare
i
costruJ
.pici
della
programmazione.
C/C++
If
(a>=0)
{
a=a-1;
};
else
{
a=a+1;
};
ASSEMBLY
start:
MOV
AL,
a
;copio
a
in
AL
CMP
AL,
0
;confronto
AL
con
0
JL
else
;se
inferiore
salto
then:
DEC
AL
;decremento
AL
JMP
ne
;salto
a
ne
else:
INC
AL
;incremento
AL
JMP
ne
;salto
a
ne
ne:
MOV
a,
AL
;copio
AL
in
a
Davide
Valeriani
Costru2o
SWITCH
Per
implementare
un
costru7o
SWITCH
(o
CASE
OF),
suciente
scomporlo
nei
tan.
IF/THEN/ELSE
da
cui
composto:
C/C++
ASSEMBLY
start:
CMP
AL,
1
;
confronto
AL
con
1
switch
(a)
{
JNE
el_1
;
se
diverso
salto
case
1:
a++;
INC
AL
;
se
uguale,
incremento
break;
JMP
ne
;
e
salto
a
ne
case
2:
a--;
el_1:
CMP
AL,
2
;
confronto
AL
con
2
break;
JNE
el_2
;
se
diverso
salto
DEC
AL
;
se
uguale
decremento
JMP
ne
;
e
salto
a
ne
}
el_2:
Davide Valeriani
Ciclo
WHILE
C/C++
ASSEMBLY
Davide Valeriani
;
azzero
CL
;
confronto
CL
con
10
;
se
maggiore
salto
;
incremento
CL
;
imposto
la
funzione
;
imposto
il
caraCere
;
chiamo
linterrupt
;
salto
a
start
(ciclo)
;
meCo
CL
in
a
Ciclo
DO
WHILE
C/C++
ASSEMBLY
Davide Valeriani
;
azzero
CL
;
incremento
CL
;
imposto
la
funzione
;
imposto
il
caraCere
;
chiamo
linterrupt
;
confronto
CL
con
10
;
se
minore,
ciclo
;
altrimen@,
termino
;
meCo
CL
in
a
Ciclo FOR
Davide Valeriani
;
confronta
CX
con
0
;
salta
se
diverso
8