int fact (int x) {
if (x == 0) return 1;
else return x * fact (x-1);
}
Code Pentium :
fact:
pushl %ebp
movl %esp,%ebp
cmpl $0,8(%ebp)
jne .L2
movl $1,%eax
jmp .L1
.align 4
jmp .L3
.align 4
.L2:
movl 8(%ebp),%eax
decl %eax
pushl %eax
call fact
addl $4,%esp
movl %eax,%eax
movl %eax,%edx
imull 8(%ebp),%edx
movl %edx,%eax
jmp .L1
.align 4
.L3:
.L1:
leave
ret
Code optimisé
fact:
pushl %ebp
movl %esp,%ebp
pushl %ebx
movl 8(%ebp),%ebx
testl %ebx,%ebx
je .L2
leal -1(%ebx),%eax
pushl %eax
call fact
imull %ebx,%eax
jmp .L4
.align 4
.L2:
movl $1,%eax
.L4:
movl -4(%ebp),%ebx
leave
ret
· | Langages formels, automates finis et analyse lexicale.
|
· | Grammaires context-free et analyse syntaxique.
|
· | Architecture des machines, code machine, assembleur.
|
· | Sémantiques opérationnelles, interpréteurs.
|
· | Code intermédiaire. Portée des variables. Environnements.
|
· | Optimisation de code. Durée de vie, allocation de registres.
|
· | Sélection d'instructions, génération de code.
|
· | Analyses statiques des programmes.
|