• Non ci sono risultati.

al linguaggio C

N/A
N/A
Protected

Academic year: 2021

Condividi "al linguaggio C"

Copied!
25
0
0

Testo completo

(1)

FONDAMENTI DI INFORMATICA

Prof. PIER LUCA MONTESSORO Università degli Studi di Udine

Dal linguaggio macchina al linguaggio C

(2)

Programma sorgente, compilatore, file oggetto, file eseguibile

programma sorgente (uno o più file ASCII)

compilatore

file oggetto (binari)

librerie (simili ai file oggetto)

file eseguibile (binario)

...

...

linker

...

(3)

Traduzione effettuata dal compilatore

• Dichiarazione di variabili

– spazi di memoria, di dimensioni opportune, riservati ai dati

• Espressioni

– traduzione in sequenze di istruzioni aritmetico-logiche

• Istruzioni di controllo

– traduzione con sequenze di istruzioni di controllo

(4)

Dichiarazione di variabili (esempi)

n: word 5 v: byte 0 byte 0 byte 0 byte 0 byte 0 int n = 5;

char v[5];

(5)

Espressioni (esempio)

n: word 0 x: word C y: word 40 ...

LDWI R0 3 LDWA R1 x ADD R1 R0 LDWA R1 y ADD R1 R0 STWA R0 n int n, x = 12, y = 64;

n = x + y + 3;

(6)

if <condizione>

{ <istruzioni>

}

; l’espressione della condizione ha

; modificato il flag Z

; ipotesi: Z=0  “vero”, Z=1  “falso”

JMPZ cont

... ; istruzioni

Y N

(7)

Y N

if <condizione>

{ <istruzioni>

}

; l’espressione della condizione ha

; modificato il flag Z

; ipotesi: Z=0  “vero”, Z=1  “falso”

JMPZ cont

... ; istruzioni

SE LA CONDIZIONE È VERA ...

(8)

Y N

if <condizione>

{ <istruzioni>

}

; l’espressione della condizione ha

; modificato il flag Z

; ipotesi: Z=0  “vero”, Z=1  “falso”

JMPZ cont

... ; istruzioni

SE LA CONDIZIONE È FALSA ...

(9)

if <condizione> {

<istruzioni ramo then>

} else {

<istruzioni ramo else>

}

; l’espressione della condizione ha

; modificato il flag Z

; ipotesi: Z=0  “vero”, Z=1  “falso”

JMPZ else

... ; istruzioni ramo “then”

... ; istruzioni ramo “then”

JMP cont

else: ... ; istruzioni ramo “else”

... ; istruzioni ramo “else”

Y N

(10)

Y N

if <condizione> {

<istruzioni ramo then>

} else {

<istruzioni ramo else>

}

; l’espressione della condizione ha

; modificato il flag Z

; ipotesi: Z=0  “vero”, Z=1  “falso”

JMPZ else

... ; istruzioni ramo “then”

... ; istruzioni ramo “then”

JMP cont

else: ... ; istruzioni ramo “else”

... ; istruzioni ramo “else”

SE LA CONDIZIONE È VERA ...

(11)

Y N

if <condizione> {

<istruzioni ramo then>

} else {

<istruzioni ramo else>

}

; l’espressione della condizione ha

; modificato il flag Z

; ipotesi: Z=0  “vero”, Z=1  “falso”

JMPZ else

... ; istruzioni ramo “then”

... ; istruzioni ramo “then”

JMP cont

else: ... ; istruzioni ramo “else”

... ; istruzioni ramo “else”

SE LA CONDIZIONE È FALSA...

(12)

while <condizione>

{ <istruzioni>

}

loop: ... ; valutazione della ... ; condizione

; l’espressione della condizione ha

; modificato il flag Z

; ipotesi: Z=0  “vero”, Z=1  “falso”

JMPZ cont

... ; istruzioni del ciclo ... ; istruzioni del ciclo JMP loop

Y

N

(13)

while <condizione>

{ <istruzioni>

}

loop: ... ; valutazione della ... ; condizione

; l’espressione della condizione ha

; modificato il flag Z

; ipotesi: Z=0  “vero”, Z=1  “falso”

JMPZ cont

... ; istruzioni del ciclo ... ; istruzioni del ciclo JMP loop

Y

N

SE LA CONDIZIONE È VERA ...

(14)

while <condizione>

{ <istruzioni>

}

loop: ... ; valutazione della ... ; condizione

; l’espressione della condizione ha

; modificato il flag Z

; ipotesi: Z=0  “vero”, Z=1  “falso”

JMPZ cont

... ; istruzioni del ciclo ... ; istruzioni del ciclo JMP loop

Y

N

SE LA CONDIZIONE È FALSA ...

(15)

do {

<istruzioni>

} while <condizione>

loop: ... ; istruzioni del ciclo ... ; istruzioni del ciclo ... ; valutazione della ... ; condizione

; l’espressione della condizione ha

; modificato il flag Z

; ipotesi: Z=0  “vero”, Z=1  “falso”

JMPNZ loop

Y N

(16)

do {

<istruzioni>

} while <condizione>

loop: ... ; istruzioni del ciclo ... ; istruzioni del ciclo ... ; valutazione della ... ; condizione

; l’espressione della condizione ha

; modificato il flag Z

; ipotesi: Z=0  “vero”, Z=1  “falso”

JMPNZ loop

Y N

SE LA CONDIZIONE È VERA ...

(17)

do {

<istruzioni>

} while <condizione>

loop: ... ; istruzioni del ciclo ... ; istruzioni del ciclo ... ; valutazione della ... ; condizione

; l’espressione della condizione ha

; modificato il flag Z

; ipotesi: Z=0  “vero”, Z=1  “falso”

JMPNZ loop

Y N

SE LA CONDIZIONE È FALSA ...

(18)

Funzioni: chiamata

• Per gestire le chiamate di funzioni viene utilizzato lo stack di sistema:

• push (variabili locali)

• copia degli argomenti della funzione in registri o aree di memoria convenzionali

• push (program counter corrente)

• program counter  indirizzo della funzione

(19)

Funzioni: ritorno

• copia del valore di ritorno in un registro o area di memoria convenzionale

• program counter  pop ()

• pop (variabili locali)

• L’utilizzo dello stack anche per le variabili consente la ricorsione!

(20)

Esempio: Fibonacci

• Si scriva in linguaggio assembler una funzione

recursiva che restituisca in R0 il valore del termine Fn della successione di Fibonacci il cui numero

d’ordine, n, è passato alla funzione in R1

• Si ricorda che:

F

0

= 0 F

1

= 1

F

n

= F

n-1

+ F

n-2

(21)

Esempio: Fibonacci

• Partiamo dal programma in linguaggio C

• Nota: in questo esercizio, per semplicità, useremo soltanto variabili nei registri (cioè non in memoria centrale) e non faremo uso di funzioni di

input/output

(22)

Esempio:

Fibonacci

int main() {

int R1 = 10;

int R0 = fibo (R1);

}

int fibo (int R1) {

if (R1 == 0) return 0;

if (R1 == 1) return 1;

return fibo (R1-1) + fibo (R1-2);

(23)

Esempio: Fibonacci (main)

; int main() ; {

START: LDWI R10 0F000 SPWR R10

LDWI R1 0A ; int R1 = 10;

CALL FIBO ; int R0 = fibo (R1);

HLT ; }

(24)

; int fibo (int R1) ; {

FIBO: MV R1 R2

JMPNZ CONT_1 ; if (R1 == 0) XOR R0 R0 ; return 0;

RET

CONT_1: LDWI R2 1 SUB R1 R2

JMPNZ CONT_2 ; if (R1 == 1) LDWI R0 1 ; return 1;

RET

Funzione FIBO - Parte I

(25)

Funzione FIBO - Parte II

CONT_2: DEC R1 PUSH R1

CALL FIBO ; /* chiama fibo (R1-1); */

POP R1 MV R0 R2 DEC R1 PUSH R1 PUSH R2

CALL FIBO ; /* chiama fibo (R1-2); */

POP R2 POP R1

ADD R2 R0

RET ; return fibo (R1-1)

+ fibo (R1-2);

; }

Riferimenti

Documenti correlati

 Formula di Taylor per funzioni Formula di Taylor per funzioni di più

▪ Per la gestione delle collisioni, ogni elemento della tabella hash contiene una lista concatenata di elementi che la funzione hash fa corrispondere alla stessa posizione

[r]

Poi confrontare le z di

[r]

Per risolvere questo esercizio con il metodo algebrico sarebbe necessario, dopo aver trovato i massimi e minimi liberi (in questo caso non ce ne sono) all’interno della

VARIABILI LOCALI, cioè sono “note” (utilizzabili) solo all’interno delle funzione nella quale sono state definite Anche i parametri di una funzione sono variabili locali!.. C

Come per le funzioni ad una sola variabile si definisce DOMINIO DI UNA FUNZIONE A due VARIABILI l'insieme dei valori che possono essere attribuiti alle variabili indipendenti