CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Question d'asm

Kelios
Kelios
Niveau 8
07 mars 2003 à 04:24:15

Salut à tous.

Bon, j´irai droit au but, j´ai un problème que je trouve bizzare, mais d,abord, voici l´intro pour comprendre:

J´ai créé une classe vector en c++ se rapprochant de celle STL, en plus simple et plus ergonomique dans mon cas.

Bon, voici l´erreur un peu bizzare, qui se produit en débug asm de VC++ 6.0(toujours bien de préciser):

189: delete[] ptr;
0040296D mov eax,dword ptr [ebp-4]
00402970 mov ecx,dword ptr [eax+8]
00402973 mov dword ptr [ebp-0Ch],ecx
00402976 mov edx,dword ptr [ebp-0Ch]
00402979 mov dword ptr [ebp-8],edx
0040297C cmp dword ptr [ebp-8],0
00402980 je TVector<CFace>::clear+4Ch ( 0040299c)
00402982 mov esi,esp
00402984 push 3
00402986 mov eax,dword ptr [ebp-8]
00402989 mov edx,dword ptr [eax]
0040298B mov ecx,dword ptr [ebp-8]
0040298E call dword ptr [edx]
00402990 cmp esi,esp
00402992 call __chkesp ( 0040d870)
00402997 mov dword ptr [ebp-10h],eax
0040299A jmp TVector<CFace>::clear+53h ( 004029a3)
0040299C mov dword ptr [ebp-10h],0

le code est correct, le problème vient des registres:
L´erreur(violation pure et dure) est à l´adresse

0040298E call dword ptr [edx]

en regardant les registres à cette ligne là, on découvre ceci:

EAX = 04878824 EBX = 7FFDF000
ECX = 04878824 EDX = FEEEFEEE ( <<<<< ? ! )
ESI = 0012FE08 EDI = 0012FE64
EIP = 0040298E ESP = 0012FE04
EBP = 0012FE64 EFL = 00000206

évidemment, l´erreur se produit en callant à l´adresse FEEEFEEE, à partir du registre EDX.

La grosse question maintenant, comment, partant de
EAX = 04878824
en faisant
00402989 mov edx,dword ptr [eax]
on passe de 04878824 à FEEEFEEE bêtement?

il doit y avoir qu,elle chose qui m´échappe, et vu que suis loin d´être un pro de l,asm, ça pourrait être tout bête.

Merci de m´éclairer.

P.S. si vous avez de besoin de plus de code, dites-le, peut-être que le code n´est pas assez explicite comme ça...

DarkPaladin
DarkPaladin
Niveau 5
07 mars 2003 à 07:22:22

En faisant "mov edx,dword ptr [eax]";
Ce n´est pas une copie de registre que tu fais,
mets plutot aller chercher la valeur(4octets) a l´adresse virtuel [04878824].

Pour que edx = 04878824, il aurait fallut faire mov edx,eax.

C´est quel type "Ptr". Si c´est un type seulement et non un multi, je te conseil "delete" a la place de "delete []".
bref, je pense que tu le savais.

Une question, as-tu redéfinis la fonction operateur pour "delete []"?

Un conseil, met toujours tes pointeurs a zero apres l´utilisation de "delete" ou "delete []".
Comme ca, si tu rappelles les fonctions delete,
il n´y aura pas de probleme. et verifie aussi la validiter du pointeur.

class1 * c1 = new class1();
if ( c1) c1->fonction1();
delete c1;
c1 = 0;
if ( c1) c1->fonction1();

Si ca fonctionne pas plus, donnes plus de codes,
un peu.

Kelios
Kelios
Niveau 8
07 mars 2003 à 16:49:42

Bon, et bien, merci de me répondre.
Primo, c´est une classe travaillant sur les template. Rien de bien extraordinaire.

template<class T>
class SEPH_API TVector
{
int size;
T *ptr;

public:

T *_Last;
T *_First;
TVector(void)
{
ptr = new T[1];
size = 0;
_First = _Last = &(ptr[0]);
}
TVector(T base)
{
ptr = new T[1];
ptr[0] = base;
size = 0;
_First = _Last = &(ptr[0]);
}
virtual ~TVector(void)
{
int i;
if(ptr)
{
//Pour toute l´array
for(i=0;i<size;i++)
ptr[i].~T();
delete[] ptr;
ptr = NULL;
}
size = NULL;
_Last = NULL;
_First = NULL;
}
int Size(void)
{
int i = size;
return i;
}
T &[](int &)
{
return ptr[b];
}
T &[](size_t b)
{
return ptr[b];
}
TVector<T> operator=(TVector<T> b)
{
int i;

delete[] ptr;
size = b.size;
ptr = new T[size];
for(i=0;i<size;i++)
ptr[i] = b[i];

_First = &(ptr[0]);
_Last = &(ptr[size-1]);

return *this;
}
void push(T t)
{
int i;
T *tTemp;
if(size==0)
tTemp = new T[1];
else
tTemp = new T[size];

for(i=0;i<size;i++)
tTemp[i] = ptr[i];

delete[] ptr;
++size;
ptr = new T[size];

for(i=0;i<size-1;i++)
ptr[i] = tTemp[i];
delete[] tTemp;

//if(size==1) donc, avant la fonction, il était de zéro, car il s´est fait ++er entre temps
_First = &(ptr[0]);//La seule façon possible, c´est donc avec clear()

_Last = &(ptr[size-1]);
ptr[size-1] = t;
}
void pop(int th)
{
int i,j;
T *tTemp;
if(size==0)
tTemp = new T[1];
else
tTemp = new T[size];

delete[] ptr;
--size;
ptr = new T[size];

//Pour tout l´array
for(i=0,j=0;j<size-1;i++,j++)
{
if(i=th-1)//Si vrai, nous sommes rendu à la case à poper
j++;
ptr[j] = tTemp[i];
}

if(th=1)//Si le poppé était le premier, on doit redirecter _First
_First = &(ptr[0]);

//On doit redirecter _Last
_Last = &(ptr[size-1]);
delete[] tTemp;
}
void clear(void)
{
int i;
if(ptr)
{
//Pour toute l´array
for(i=0;i<size;i++)
ptr[i].~T();
delete[] ptr;
ptr = NULL;
}
size = 0;
_First = NULL;
_Last = NULL;
}
};

Si quelqu´un a une solution, qu´il le dise, car la seule que je vois pour l´instant est de recommencer ma clsse template de zéro, ou encorel´enlever carrément.

Lightness1024
Lightness1024
Niveau 10
07 mars 2003 à 21:17:23

au fait ce ke tu as en EDX ca ressemble pas mal au remplissage du compilateur en mode debug.

Lightness1024
Lightness1024
Niveau 10
07 mars 2003 à 21:22:04

et au fait si tu veu un pti exemple : ))))

( j´en profite toujours pour la ramener celle la LOL)

http://www.cppfrance.com/article.aspx?Val=840

c ma classe a moi un peu comme la tienne mais ki ne foire pas l´ombre d´une seconde.
la preuve tout projet serhum est bati dessus ( serhum.fr.st)

voila si tu vois ke ya des differences flagrantes entre mon code et ton code peut etre ke tu pourra trouver des trucs ki tu aurais mal fait ou autre chose je ne sais pas, en tout cas ca peut servir !

Kelios
Kelios
Niveau 8
08 mars 2003 à 01:18:21

MIRACLE!
Il me manquait un constructeur de copie ( >honte<)

Ouah, merci mille fois Lightness, grâce à toi et à ton SecureArray dont j´ai soutiré un max d´infos sur son constructeur de copie et son opérateur d´affection =)

J´en suis extrêmement reconnaissant, bonne chance avec ton projet Serhum!(surtout s´il est basé sur des bases solides comme ça, ouah, ca va être génial)

Kelios
---------

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment