Esercizi vari II 1 Corso di Fondamenti di Informatica 2CdL Ingegneria InformaticaIng. Franco Zambonelli
ARCHITETTURA DEGLI ELABORATORI:ESERCIZI ASSEMBLER(Completi + Traduzioni dal C)
Lucidi Realizzati in Collaborazione con:
Prof. Letizia LeonardiUniversità di Modena
Prof. Antonio CorradiUniversità di Bologna
Esercizi vari II 2 ESEMPIO
SCRITTURA DEL SEGUENTE PROGRAMMA:
#define N 10int s, v[]= {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
main(){int i;s=0;for (i=0; i<=N; i++)s = s + v[i];};
Esercizi vari II 3 ESEMPIO: Programma che somma i numeri da 0 a 10Soluzione A ===> solo uso di registri
push ds; preparazione delmov ax, 0; ritorno al sistema operativopush axmov di, 0; DI rappresenta la variabile smov si, 0; SI rappresenta la variabile iverifica:cmpsi,10jgshort fineciclo:movax, diaddax, simovdi, axincsijmp short verificafine:ret
!"#
$%
$%
db 256 dup('stack ') ; byte 8 * 256
& !'(
)*+,!'!+!! -##.(,+
Esercizi vari II 4 Soluzione B===> uso di registri e variabili
/012/345
67589 :
/013 :
;44<75=4>/012/3
?@4>1AB2
?44>CBD_mainprocfarpush dsmov ax, 0push axmov ax, DATI;mov ds, ax; DS <- DATI mov s, 0mov si, 0; SI contiene la variabile iverifica:cmpsi, Njgshort fineciclo:movax, saddax, simovs, axincsijmp short verificafine:ret
E7;F858@
G
/012/358@4
HIJKLM
NOMPQ R
HIJI R
Ndw10sdw?
1AB258@4
CBD45
67589CBA/S :
CBA/S :
db 256 dup('statck')
CBD58@4
58@
Esercizi vari II 5 Soluzione C===> uso di registri e variabili
$
push dsmov ax, 0push axmov ax, DATImov ds, ax mov s, 0mov si, 0verifica:cmpsi, word ptr Njgshort fineciclo:movax, word ptr saddax, simov word ptr s, axincsijmp short verificafine:ret
$
$$
Ndb10sdb?
$
$%
$%
db 256 dup('statck')
Esercizi vari II 6 Soluzione D===>indirizzamento INDIRETTOtramite registro BASE
/012/345
67589 :
/013 :
;44<75=4>/012/3
?@4>1AB2
?44>CBD E7;F8
GTU=V;Tpush dsmov ax, 0push axmov ax, DATImov ds, axmov di, 0mov si, 0mov bx, Pverifica:cmpsi, [bx]jgshort fineciclo:movax, diaddax, simovdi, axincsijmp short verificafine:ret
E7;F858@
G
/012/358@4
1AB245
67589 :
1ABA :
Ndw10
W@XY
1AB258@4ST1...
58@
Esercizi vari II 7 Z [ \\\
] [[ ^_tramite registro INDICE dati memorizzati in un vettore
$
pushdsmovax, 0pushaxmovax, DATImovds, axmovs,0movsi, 0verifica:cmpsi,10jgshort fine movdi, sishldi, 1 ; moltiplicazione per DUEmovax, saddax, [v+di]; v[di]movs,axincsijmpshort verificafine:ret
Esercizi vari II 8 1AB245
67589 :
1ABA :
s dw ?vdw0; usare la REPT per otteneredw1; la stessa definizionedw2dw3dw4dw5dw6dw7dw8dw9dw10
1AB258@4
CBD45
67589CBA/S :
CBA/S :
db 256 dup ('stack ')
CBD58@4
58@
Esercizi vari II 9 ESERCIZIO: Procedura che somma un range di numeri interida inizio a finesomma = inizio + (inizio+1) ... (fine-1) + fine
Versione C:int somma (int inizio, int fine){ int s, i;s = 0;for (i = inizio; i <= fine; i++)s = s + i;return s;}
Versione ASSEMBLER:
`
a
b
aZ
`
`
;int somma (int inizio, int fine);
; inizio procedura sommapushbp ; salvataggio BP chiamantemovbp,sp ; posizionamento BPpushsi ; salvataggio registri usatipushdi
; { int s, i; ; questa versione usa; s = 0; ; DI per s e SI per i; cioe' la traslazione utilizza i REGISTRI della macchina; ===> OTTIMIZZAZIONExordi,di ; azzeramento DI (cioè s);
Esercizi vari II 10 ; for (i = inizio; i <= fine; i++)movsi,word ptr [bp+4] ; SI <== iniziojmp short verifica ; verifica la fine del forciclo:;;s = s + i;movax,di ; AX <== DI (somma corrente)addax,si; AX <== DI + SI (operando correntemovdi,ax ; In DI la somma correnteincsi; incremento di SI (cioe' i)
verifica:cmpsi,word ptr [bp+6]; verifica la fine del forjleshort ciclo
;;return s;movax,di ; in AX c'e' la somma risultante;;}popdi ; ripristino registri usatipopsipopbp ; ripristino BPret; si ritorna
E4U77;58@
G
Esercizi vari II 11
push ds; memorizza nello stack l'indirizzomov ax, 0; cui saltare al RETpush ax; (a ds:0000 la chiamata a int 20H)
; S = somma(0, 10);
movax,10; SECONDO parametro sullo stack (fine=10)pushaxxorax,ax; PRIMO parametro sullo stack (inizio=0)pushaxcallnear ptr _somma ; chiamatapopcx; estrazione dei parametripopcx; dallo stack
; in AX c'e' il risultato della proceduraret; terminazione
`
cd^e
$%
db 256 dup('stack ')
^
Esercizi vari II 12 ESERCIZIO:Nell'esercizio precedente la traslazione veniva fatta utilizzandoi REGISTRI : questa volta NON utilizziamo i registri
le variabili locali sono inserite nel record di attivazione dellasingola invocazione di somma; s == BP (registro record di attivazione) - 2
Procedura ASSEMBLER somma:
EB3fB45
67589g
h95
G<giF= :
/013 :
;44<75=4>
EB3fB
?@4>
EB3fB
?44>49D E4U77;
GTU=85;T;int somma (int inizio, int fine)pushbpmovbp,spsubsp,4
; si riserva spazio per le variabili locali s ed imovword ptr [bp-2],0; s <== 0
; for (i = inizio; i <= fine; i++)movax,word ptr [bp+4]; iniziomovword ptr [bp-4],ax ; i <== iniziojmpshort verifica
Esercizi vari II 13 ciclo:; s = s + i;movax,word ptr [bp-2] ; s correnteaddax,word ptr [bp-4] ; AX <== s + imovword ptr [bp-2],ax ; nuovo sincword ptr [bp-4]; i++
verifica:movax,word ptr [bp-4]; i correntecmpax,word ptr [bp+6]; i <= fine ?jleshort ciclo
;return s;movax,word ptr [bp-2] ; AX <== s correntemovsp,bppopbpret
Esercizi vari II 14 ESERCIZIO:Procedura RICORSIVA che somma un range di numeri interi
Versione C:
int somma (int inizio, int fine){if (inizio < fine)return (inizio + somma (inizio + 1, fine));else if (inizio==fine) return inizio;else return 0;}
Versione ASSEMBLER:
EB3fB45
67589g
h95
G<giF= :
/013 :
;44<75=4>
EB3fB
?@4>
EB3fB
?44>49D;;int somma (int inizio, int fine);
E4U77;
GTU=85;Tpushbp; salvataggio BP chiamantemovbp,sp; posizionamento BPpushsi ; salvataggio registromovsi,word ptr [bp+4] ; SI <== inizio;;{ if (inizio < fine);cmpsi,word ptr [bp+6]; inizio >= fine ?jgeshort fine
Esercizi vari II 15 ;; return (inizio + somma (inizio+1, fine));;pushword ptr [bp+6] ; secondo parametro (fine) sullo stackmovax,si ; AX <== inizioincax ; inizio +1push ax; 1o parametro (inizio+1) sullo stackcallnear ptr _somma; chiamata RICORSIVApopcx; togliamo i parametripopcx; dallo stackaddax, si; AX <== inizio + risultato (AX)jmplastfine:;else if (inizio==fine) return inizio;cmpsi,word ptr [bp+6] ; inizio == fine ?jeshort fineultima;else return 0;mov ax, 0; inizio > finejmp lastfineultima:mov ax, si; inizio == finelast:popsi ; ripristino registripopbpret ; ritorno
Esercizi vari II 16 ESEMPIO:PROGRAMMA IN C CHE USA UNA FUNZIONE SCRITTAIN ASSEMBLER (MODELLO SMALL)
Programma C:
extern int f(char c, int b); /* funzione Assembler */
void main(){int A, B;char C;
printf("Scrivi un carattere e un numero intero\n");scanf("%c %d", &C, &B);A = f(C, B);printf("Il valore risultante e' %d\n", A);}
Traduzione della funzione
jklm
nopqro
sjklt
u
v
jm
nowwx
q x
urylzrk{
|
y}~yrylzrkt
|