• Non ci sono risultati.

(2)Esercizi vari II 3 ESEMPIO: Programma che somma i numeri da 0 a 10Soluzione A ===&gt

N/A
N/A
Protected

Academic year: 2021

Condividi "(2)Esercizi vari II 3 ESEMPIO: Programma che somma i numeri da 0 a 10Soluzione A ===&gt"

Copied!
23
0
0

Testo completo

(1)

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

(2)

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@

(3)

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@

(4)

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@

(5)

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

(6)

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

(7)

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

(8)

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

|



Riferimenti

Documenti correlati

Per studiarne la monotonia e l’esistenza di eventuali punti di massimo, studiamo il segno della derivata prima.. Ne concludiamo che sia a che c

Provare la seguenti propriet` a utilizzando i soli assiomi algebrici dei numeri reali ed eventualmente le propriet` a che la precedono.. Risolvere gli esercizi 1-4 del libro

La somma dei diametri maggiori di tutte le lesioni target deve essere calcolata e registrata al momento della valutazione basale ed utilizzata in seguito come

ii) Rispondere alle stesse domande nella seguente variante del caso prece- dente: i due agenti scelgono in modo indipendente l’uno dall’altro; il primo, se guadagna 10 cambia, mentre

B.3 Dove si mette in relazione il coefficiente di attrito con la funzione di correlazione della forza casuale: è un esempio del teorema

[r]

Dopo avere bevuto ogni elefante fa un giretto e torna a bere dopo 1 secondo.. C'e' un branco di M=10 pekari che bevono ciascuno ogni volta 1 litro impiegando ciascuno 1/100

è preceduto dal segno + se numeratore e denominatore sono concordi è preceduto dal segno – se numeratore e denominatore sono discordi ha al numeratore il valore assoluto del