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:
#include <stdio.h>
int f
();
int main
() {
int x = f
();
// chiamata a f definita in f.s
printf("x=%d\n", x
);
return 0;
}
int f() {
return 10;
}
Traduzione in IA32 della funzione
f:
.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
#include <stdio.h>
int f
();
int main
() {
int x = f
();
// chiamata a f definita in f.s
printf("x=%d\n", x
);
return 0;
}
int f() {
return 10*5+1;
}
Traduzione in IA32 della funzione
f:
# 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
#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;
}
int f(int x, int y, int z) {
return 2*x - 3*y + z;
}
Traduzione in IA32 della funzione
f:
# 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