A propos du prélude et finlude dans les fonctions en ASM

Il est courrant de voir des codes sources ASM qui utilisent une vieille habitude moisie qui ressemble à ceci :

ma_fonction:
push ebp
mov  ebp, esp
[...blah...]

Cette habitude moisie nous vient tout droit du moyen âge où le seigneur Hixe Quatrevainsix du Maude Saizebit ne pouvait point adresser directement sur esp.
En gros avant on ne pouvait pas faire des trucs du genre “mov [esp+8], eax”.

Pourquoi cette habitude est elle moisie ?

1- Elle ne sert à rien si on ne touche pas à ebp au sein de la fonction.
2- Elle nous bouffe EBP pour rien si on a besoin de registres.

Ils auront beau vous dire “Oui mais ceci très cher est une convention conventionelle et conventionnée de codage propre”. Vous ne vous gènerez pas pour leur répondre “Quenéni mon couillon, cette habitude est tombée en désuétude”.

Quoi faire alors?

En gros retenez la chose suivante: Il ne faut sauvegarder EBP, EDI et ESI dans une fonction que si on compte s'en servir.

Si vous voulez utiliser un de ces registres, il suffit simplement de les placer quelque part sur la stack. Et au besoin vous réserver un peu d'espace avec un “sub esp, SOMETHING” où SOMETHING est l'espace que vous avez besoin pour stocker d'autres infos sur la stack.

Exemple, vous voulez utiliser EBP, ESI et EDI :

ma_fonction:
sub esp, 12     ; on garde de l'espace pour d'autre opérations (3 adresses là)
push ebp
push esi
push edi

[...blah...]

pop edi
pop esi
pop ebp
add esp, 12     ; on clean toussa
ret

C'est tout !

Alors n'oubliez pas, si vous tombez sur un tuto qui vous explique “bla bla c'est bien c'est propre bla bla”, ne tenez pas compte de ces douces âneries.

jfg 2007/09/24 19:21

codaz/asm/asm_fonctions_prelude.txt · Last modified: 2010/01/12 13:29 (external edit)