BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 5 sept. 2005 à 23:56
le param est en [esp+4], en [esp] il y a le pointeur d'instruction.
Si tu le retrouves par [ebp+8] c'est parce qu'il y a eu une stackfram de faite en entrée de fonction, ce n'est absolument pas obligatoire et c'est à toi d'en décider.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 6 sept. 2005 à 16:00
pour un prog 32 bits faut de l'asm 32 bits, c'est clair.
Si tu utilises VC++, inutile de faire de la compil séparée, tu mets direct l'asm dans les fichiers c:
__declspec(naked) int __stdcall AjouteCinq(int nbr)
{
__asm {
mov eax, [esp+4]
add eax, 5
ret 4
}
}
grace à "__declspec(naked)" on écrit du vrai asm en gérant absolument tout et le compilo n'y mettra pas ses pattes.
C'est d'ailleurs ainsi que je conçois l'asm avec le C, si on met des bouts d'asm au milieu d'une fonction où le reste est en C on ne fait que gêner l'optimidation du compilo, il faut faire du tout ou rien.
ciao...
BruNews, MVP VC++
Vous n’avez pas trouvé la réponse que vous recherchez ?
et on indexe sur ebp.
Avantage: taille instructions plus courte.
Incovénients: temps perdu en entrée et sortie, ebp inutilisable en registre de calcul.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 18 sept. 2005 à 11:53
donne le but de ta fonction écrit en C que je comprenne ce que tu veux.
mov eax, [esp+8]
en dernière instruction fait retourner snb à ta fonction, rien de plus.
anonyme_man_in_this_world
Messages postés161Date d'inscriptionsamedi 25 juin 2005StatutMembreDernière intervention 1 août 2006 21 sept. 2005 à 01:21
bon ,je vais essayer d'etre plus clair : lorsque j'essaie de faire un ret 0
ou une autre valeur ,le programme se termine d'une façon catastrophique .
bref comment traduire cet exemple en asm ?
#include
int function(int&a , int&b)
{
a = a + b ;
b = a ;
return a+1 ;
}
int main()
{
int a=1,b=1,c;
c = function(a,b) ;
cout<<a<<endl;
cout<<b<<endl;
cout<<c<<endl;
silkscalp
Messages postés27Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention20 janvier 2011 21 sept. 2005 à 19:47
En
fait il me semble que le probleme que tu as est que vu que tu
n'utilises pas de stack frame, tu dois gerer avec ton ret ou retrouner
dans la pile sur EIP.
BruNews me corrigera mais je crois que c'est pour retourner au bonne endroit dans la stack que l'on utilise ret 8.
Il me semble non ? (question pour BruNews) en fait tes arguments sont
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 21 sept. 2005 à 20:03
EIP est bien en [esp] en entrée de fonction.
"ret 8" indique de dépiler 8 octets, chaque param est de 4 octets dans un code pour système 32 bits.
Comme si le processeur faisait:
pop eip
add esp, 8
jmp eip