Base pointer

Signaler
Messages postés
161
Date d'inscription
samedi 25 juin 2005
Statut
Membre
Dernière intervention
1 août 2006
-
Messages postés
161
Date d'inscription
samedi 25 juin 2005
Statut
Membre
Dernière intervention
1 août 2006
-
salut !!

je voudrais faire une compilation separee qui va me permetre de faire du code C

et asm dans des fichiers differents .mes questions sont :

j'ai constaté que lorsqu'on veut definir en asm la fonction function(int*a)

declarée dans un fichier .c , le pointeur*a(4 octets ) et stocké à [bp+8] .

pourquoi il n'est pas(*a) à [bp+4](en fait j'ai constaté que dans tous les que j'ai

vu qu'on le nombre d'octet sur lequelle est code le parametre est double) ?

2- et si on avait function(int*a,int*b) . est ce que *b est stocké à [bp+16]

ou à [bp+12] ?

superbe merçi d'avance .

@++

15 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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.

ciao...
BruNews, MVP VC++
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
salut,

c'est du 16 ou 32bits ?

@++
Messages postés
161
Date d'inscription
samedi 25 juin 2005
Statut
Membre
Dernière intervention
1 août 2006

merçi pour la reponse BruNews.mais je crois qu'il y en a un probleme : le

compilateur que je vais utiliser(gcc ou Visual C++) est 32 bits , tandis que

sous nasm je vais faire du 16 bits.est il possible que ça fonctionnera

correctement ?

merçi d'avance .
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++
Messages postés
161
Date d'inscription
samedi 25 juin 2005
Statut
Membre
Dernière intervention
1 août 2006

merçi pour les explications
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
BruNews> le ret 4 correspond a quoi ici ?
Et c'est quoi "une stackfram de faite en entrée de fonction" ?

Merci par avance

Shell
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
ret 4
depile les 4 octets du param (system 32 bits) et retourne au code sur EIP.

stackframe:
push ebp
mov ebp, esp
...
....
mov esp, ebp
pop ebp

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.

ciao...
BruNews, MVP VC++
Messages postés
161
Date d'inscription
samedi 25 juin 2005
Statut
Membre
Dernière intervention
1 août 2006

re !

desolé, mais j'ai pas vraiment tout compris , j'ai essayé ce petit code qui n'a

pas fonctionné comme je voudrais :

#include
using namespace std ;
__declspec(naked) int __stdcall AjouteCinq(int nbr,int snb)
{
__asm {
mov eax, [esp+4]
add eax, 5
mov eax, [esp+8] // ça affecte la valeur de snb a nbr !!!
ret 8
}
}
int main()
{
int a= 0 ;
int b = 4 ;
a = AjouteCinq(a,b) ;
cout<<a<<endl; // 4
cout<<b<<endl; // 4
return 0;
}
merçi d'avance
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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.

ciao...
BruNews, MVP VC++
Messages postés
161
Date d'inscription
samedi 25 juin 2005
Statut
Membre
Dernière intervention
1 août 2006

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;

return 0;
}
merçi d'avance
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
__declspec(naked) int __stdcall function(int *a,int *b)
{
__asm {
mov ecx, [esp+4] ; ECX = *a
mov edx, [esp+8] ; EDX = *b
mov eax, [ecx] ; EAX = a
add eax, [edx] ; a + b
mov [ecx], eax ; a = a + b
mov [edx], eax ; b = a
inc eax
ret 8
}
}

ciao...
BruNews, MVP VC++
Messages postés
27
Date d'inscription
lundi 30 octobre 2000
Statut
Membre
Dernière intervention
20 janvier 2011

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

b en ESP+8

a en ESP+4

et l'adresse de retour en ESP

c'est ca non ?

(c'est pour voir si je cromprend ou pas)

Merci.

Silk
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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

ciao...
BruNews, MVP VC++
Messages postés
27
Date d'inscription
lundi 30 octobre 2000
Statut
Membre
Dernière intervention
20 janvier 2011

Merci c'est ce que je pensais.

++

SILKSCALP

LE SAVOIR EST UN POUVOIR
LE TRANSMETTRE EST UN DEVOIR
Skyfront ou silk ou sky
Messages postés
161
Date d'inscription
samedi 25 juin 2005
Statut
Membre
Dernière intervention
1 août 2006

superbe merçi pour tes explications bruNews .

A++