Sistemi di Calcolo

Corso di Laurea in Ingegneria Informatica e Automatica - A.A. 2017-2018

HomePage | Avvisi | Diario lezioni | Programma | Materiale didattico | Esami | Forum | Login

Lunedì 2 ottobre 2017 (Lezione 2 - 150 min) - Demetrescu


Sessione pratica con spiegazioni:

Esempio 1: funzioni senza parametri e creazione file .s

Programma con funzione senza parametri con valore di ritorno intero:

main.c
#include <stdio.h>

int f();

int main() {
    int x = f(); // chiamata a f definita in f.s
    printf("x=%d\n", x);
    return 0;
}


f.c
int f() {
    return 10;
}


Traduzione in IA32 della funzione f:

f.s
.globl f

f:
    movl $10, %eax
    ret


Si noti la direttiva .globl f che consente alla funzione f di essere invocata da moduli esterni a f.s.

Compilazione (si noti -m32 che è indispensabile se si compila su ambienti a 64 bit):

> gcc -m32 main.c f.s -o f


Il comando genera il file eseguibile f, che disassemblato con objdump -d fornisce (omesse parti non interessanti):

f:     file format elf32-i386

...

0804841d <main>:
 804841d:	55                   	push   %ebp
 804841e:	89 e5                	mov    %esp,%ebp
 8048420:	83 e4 f0             	and    $0xfffffff0,%esp
 8048423:	83 ec 20             	sub    $0x20,%esp
 8048426:	e8 1f 00 00 00       	call   804844a <f>
 804842b:	89 44 24 1c          	mov    %eax,0x1c(%esp)
 804842f:	8b 44 24 1c          	mov    0x1c(%esp),%eax
 8048433:	89 44 24 04          	mov    %eax,0x4(%esp)
 8048437:	c7 04 24 e0 84 04 08 	movl   $0x80484e0,(%esp)
 804843e:	e8 ad fe ff ff       	call   80482f0 <printf@plt>
 8048443:	b8 00 00 00 00       	mov    $0x0,%eax
 8048448:	c9                   	leave  
 8048449:	c3                   	ret    

0804844a <f>:
 804844a:	b8 0a 00 00 00       	mov    $0xa,%eax
 804844f:	c3                   	ret    

... 


Esempio 2: funzioni senza parametri che calcolano espressioni


main.c
#include <stdio.h>

int f();

int main() {
    int x = f(); // chiamata a f definita in f.s
    printf("x=%d\n", x);
    return 0;
}


f.c
int f() {
    return 10*5+1;
}


Traduzione in IA32 della funzione f:

f.s
# int f() {
#    return 10*5+1;
# }

# C equiv
# int x = 10
# x = x*5
# x++
# return x

.globl f

f:
    movl $10, %eax   # int x = 10    x <-> eax
    imull $5, %eax   # x = x*5
    incl %eax        # x++
    ret


Si noti come il programma originale è stato inserito per comodità di consultazione come commento nel codice. Si noti inoltre come, prima di tradurre il codice C in assembly, abbiamo riscritto la funzione in una forma equivalente (sempre in C), ma più direttamente traducibile in IA32.

Esempio 3: funzione con parametri


main.c
#include <stdio.h>

int f(int x, int y, int z);

int main() {
    int res = f(10,20,30); // chiamata a f definita in f.s
    printf("res=%d\n", res);
    return 0;
}


f.c
int f(int x, int y, int z) {
    return 2*x - 3*y + z;
}


Traduzione in IA32 della funzione f:

f.s
# int f(int x, int y, int z) {
#    return 2*x - 3*y + z;
# }

# C equiv
# int a = x;
# int c = y;
# int d = z;
# a = a * 2
# c = c * 3
# a = a - c
# a = a + d
# return a

.globl f

f:
    movl 4(%esp), %eax  # int a = x    a <-> %eax   x <-> 4(%esp)
    movl 8(%esp), %ecx  # int c = y    c <-> %ecx   y <-> 8(%esp)
    movl 12(%esp), %edx # int d = z    d <-> %edx   z <-> 12(%esp)
    imull $2, %eax      # a = a * 2
    imull $3, %ecx      # c = c * 3
    subl %ecx, %eax     # a = a - c
    addl %edx, %eax     # a = a + d
    ret                 # return a
Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by WikkaWiki
Page was generated in 0.0653 seconds