Sei sulla pagina 1di 8

Corso

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;
};

Controllo di usso in Assembly

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:

Controllo di usso in Assembly

Davide Valeriani

Ciclo WHILE
C/C++

ASSEMBLY

init: MOV CL,0


a=0;
start: CMP CL,10d
While (a<=10) {
JG ne
a++;
INC CL
prinl(%d,a);
MOV AH, 02h
}
MOV DL, CL
INT 21h
JMP start
ne: MOV a, CL
Controllo di usso in 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

init: MOV CL,0


a=0;
start: INC CL
Do {
MOV AH, 02h
a++;
MOV DL, CL
prinl(%d,a);
INT 21h
}
CMP CL,10d
While (a<10)
JL start
JMP ne
ne: MOV a, CL
Controllo di usso in 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

Per il ciclo FOR, esiste listruzione LOOP e9che2a. Per


u.lizzarla, occorre impostare il registro CX con il numero
di volte che va eseguito il ciclo.
C/C++ ASSEMBLY
For (i=10; i>0; i--) start: MOV CL, 10d ; imposto CL
MOV CH, 0 ; azzero CH
{
ciclo: MOV AH, 02h ; imposto la funzione
prinl(%d,i);
MOV DL, CL ; imposto il caraCere
}
INT 21h ; chiamo linterrupt
LOOP ciclo ; decrementa CX

Controllo di usso in Assembly

Davide Valeriani

; confronta CX con 0
; salta se diverso
8