Additions:
===Lunedì 2 ottobre 2017 (Lezione 2 - 150 min) - Demetrescu===
==Esempio 1: funzioni senza parametri e creazione file .s==
Deletions:
==Lunedì 2 ottobre 2017 (Lezione 2 - 150 min) - Demetrescu==
===Esempio 1: funzioni senza parametri e creazione file .s===
Additions:
===Esempio 3: funzione con parametri===
int f(int x, int y, int z);
int res = f(10,20,30); // chiamata a f definita in f.s
printf("res=%d\n", res);
int f(int x, int y, int z) {
return 2*x - 3*y + z;
# int f(int x, int y, int z) {
# return 2*x - 3*y + z;
# int a = x;
# int c = y;
# int d = z;
# a = a * 2
# c = c * 3
# a = a - c
# a = a + d
# return a
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
Additions:
# return x
Additions:
return 10*5+1;
# int f() {
# return 10*5+1;
# }
# C equiv
# int x = 10
# x = x*5
# x++
movl $10, %eax # int x = 10 x <-> eax
imull $5, %eax # x = x*5
incl %eax # x++
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.
Additions:
===Esempio 1: funzioni senza parametri e creazione file .s===
Programma con funzione senza parametri con valore di ritorno intero:
===Esempio 2: funzioni senza parametri che calcolano espressioni===
Deletions:
===Creazione file .s===
Esempio programma con funzione senza parametri con valore di ritorno intero:
Additions:
Si noti la direttiva ##.globl f## che consente alla funzione ##f## di essere invocata da moduli esterni a ##f.s##.
Additions:
Il comando genera il file eseguibile ##f##, che disassemblato con ##objdump -d## fornisce (omesse parti non interessanti):
Deletions:
Il comando genera il file eseguibile ##f##, che disassemblato con ##objdump -d## fornisce:
Additions:
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:
f: file format elf32-i386
...
0804841d :
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
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
8048443: b8 00 00 00 00 mov $0x0,%eax
8048448: c9 leave
8048449: c3 ret
0804844a :
804844a: b8 0a 00 00 00 mov $0xa,%eax
804844f: c3 ret
...
Additions:
Traduzione in IA32 della funzione ##f##:
%%(asm;f.s)
.globl f
f:
movl $10, %eax
ret
Additions:
===Creazione file .s===
Esempio programma con funzione senza parametri con valore di ritorno intero:
%%(c;main.c)
#include
int f();
int main() {
int x = f(); // chiamata a f definita in f.s
printf("x=%d\n", x);
return 0;
}
%%(c;f.c)
int f() {
return 10;
}
Deletions:
%%(text)