online faq recherche accueil
 

Il y a 68 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

[Assembleur]La perte de durabilité

 
n°14284
pralinor
Lightwave's 999ers
Posté le 16-11-2007 à 21:12:45  profilanswer
 

En ces temps d'absence Myrdinnesque, Ulmoesque et Pralinoresque, un peu d'assembleur nous manque ^_^ non ? Ah bon.
 
Je vais penser dans ce post que ça nous manque. Et je vous propose d'étudier une fonction ajourd'hui :
 
                                     La perte de durabilité d'un objet
 
Je renvoie avant toute chose aux nombreux posts de Myrdinn, ou aux (moins nombreux) posts de moi-même.
 
Voici un petit medley :
 
Les structures du jeu par Myrdinn
Quelques notions d'informatique par Myrdinn
Calcul des dégats physiques par Myrdinn
Fonctionnement de OllyDBG par Myrdinn
Le MF par Myrdinn
Le MF 2 par Myrdinn
Le ITD par Pralinor
 
Notre objectif va être de comprendre comment fonctionne la perte de durabilité.
 
Tout d'abord quelques prérequis : Voici un Excel des MPQs qui seront utilisés dans cette analyse (il n'y a que ce qui nous intéresse).
OllyDBG, utile si vous voulez faire les exercices ^_^
 
NB : NPP = Note Pour Pralinor (Pralinor, c'est moi)
 
Tout d'abord la fonction en question :
 


PUSH ECX
PUSH EBP
PUSH EDI
MOV EDI,EAX
PUSH 32
PUSH EDI
CALL <JMP.&D2Common.#10890>
PUSH 2D
PUSH EDI
MOV EBP,EAX
CALL <JMP.&D2Common.#10890>
TEST EBP,EBP
MOV DWORD PTR SS:[ESP+8],EAX
JNZ SHORT D2Game.04792AC7
TEST EAX,EAX
JE D2Game.04792D1B
PUSH EDI
CALL <JMP.&D2Common.#10792>
TEST EAX,EAX
JE D2Game.04792D1B
TEST EBP,EBP
PUSH EBX
MOV EBX,4
JNZ SHORT D2Game.04792AF8
PUSH EDI
CALL <JMP.&D2Common.#10955>
TEST EAX,EAX
JE SHORT D2Game.04792AFD
MOV EAX,DWORD PTR SS:[ESP+14]
MOV ECX,DWORD PTR DS:[EAX+70]
TEST ECX,ECX
JE D2Game.04792D1A
MOV EBX,0A
MOV EAX,DWORD PTR DS:[ESI+20]
MOV ECX,6AC690C5
MUL ECX
MOV ECX,DWORD PTR DS:[ESI+24]
XOR EBP,EBP
ADD EAX,ECX
ADC EDX,EBP
MOV DWORD PTR DS:[ESI+24],EDX
XOR EDX,EDX
MOV ECX,64
MOV DWORD PTR DS:[ESI+20],EAX
DIV ECX
CMP EDX,EBX
JGE D2Game.04792D1A
PUSH EBP
PUSH 48
PUSH EDI
CALL <JMP.&D2Common.#10061>
MOV EBP,EAX
DEC EBP


Pas de panique on va la découper ensemble pour comprendre ce qu'elle fait.


Message édité par pralinor le 16-11-2007 à 22:47:11
n°14285
pralinor
Lightwave's 999ers
Posté le 16-11-2007 à 21:13:05  profilanswer
 

OK, on y va.
 

PUSH ECX
PUSH EBP
PUSH EDI
MOV EDI,EAX


 
Un peu d'assembleur : L'instruction PUSH sert à mettre un registre ou un nombre dans la pile. MOV, comme sont nom l'indique déplace un registre A dans B. MOV A, B doit se lire : Move B to A et non l'inverse.
 
Dis, dis, Pralinor, toi, qui sait plein de choses, qu'est-ce ça fait : Objectivement, comme au début de chaque fonction, ça sauvegarde certains registres.  
 
Maintenant qu'a-ton dans ces registres ???
 
Dans EBP : 00 00 00 00 02 00 00 00. Il s'agit d'un structure de Diablo 2 appelée PtUnit. Dans notre cas, le 00 00 00 00 signifie joueur et 02  00 00 00 nécromancien. On sauvegarde donc le  joueur.
 
Dans EDI : 01 00 00 00 3F 00 00 00. Encore un Ptunit. Ici : 01 00 00 00 est un monstre. Quant à 3F, il faut aller voir dans le fichier Mpq fourni, onglet MonStats. Pour rappel, 3F, c'est de l'hexadécimal, pensez donc à regarder dans cette colonne... On peut voir qu'il s'agit d'un quillrat1 (les porc épic de l'acte 1). On sauvegarde donc le monstre que je suis en train d'attaquer.
 
Dans EAX : 04 00 00 00 C8 00 00 00. PtUnit encore. 04 : Il s'agit d'une arme. C8, il faut aller dans l'onglet Weapons, il s'agit donc d'une Berserker Axe.  
 
Nous avons donc sauvegardé le joueur, le monstre (qui attaque ou qui est attaqué) et finalement l'arme d'attaque. L'arme d'attaque est placé dans EDI.
 

PUSH 32
PUSH EDI
CALL <JMP.&D2Common.#10890>


 
Un peu d'assembleur : Il s'agit ici d'un appel de fonction. ON sauvegarde 2 valeurs 32 et EDI qui vont servir de paramètres d'appel à la fonction 10890.
 
Ce qu'il faut savoir : La fonction 10890 (qui a changé de nom depuis la 1.11... o_O) sert à connaitre le type d'objet. L'onglet ItemType est cette fois à regarder à la valeur 32... Donc Any armor, soit donc, une armure. La fonction  10890 avec l'appel 32 sert donc à savoir si l'objet est une armure. La valeur de retour est 0 ou 1 placé dans EAX.
 
Dis, dis, Pralinor, toi, qui sait plein de choses, qu'est-ce ça fait : Rappelons que dans EDI se trouve l'arme (disons plus précisemment l'objet impliqué). Dans notre cas, l'objet affecté est une arme, donc la fonction 10890 devrait logiquement renvoyé 0 dans EAX. (1 si c'est une armure).
 

PUSH 2D
PUSH EDI
MOV EBP,EAX
CALL <JMP.&D2Common.#10890>


 
Dis, dis, Pralinor, toi, qui sait plein de choses, qu'est-ce ça fait : Je pense aucune difficulté ici... On teste 2D. 2D, c'est weapon. On teste si c'est une arme. Notons toutefois que l'on insere une instruction : MOV EBP, EAX. En clair, avant l'appel de la fonction Typed'Objet on sauvegarde dans EBP la valeur du précédent test (donc, est-ce que c'est une armure ou pas).
 

TEST EBP,EBP
MOV DWORD PTR SS:[ESP+8],EAX
JNZ SHORT D2Game.04792AC7


 
Un peu d'assembleur : Bon, je peux renvoyer à ma précédente explication de l'instruction TEST EBP, EBP. Mais je rappelle : TEST réalise la comparaison de ses paramètres et correspond à un ET logique. Donc TEST EBP, EBP équivaut à ET EBP, EBP. Globalement donc, si EBP = 0, ça donnera ET 0, 0 = 0, si EBP à une valeur X, alors ET X,X = 1. En français TEST EBP, EBP permet de vérifier si EBP est renseigné (retour à 1) ou pas (retour à 0). Voilà, j'espère que maintenant c'est clair ^_^
 
Rappelons également que TEST modifie des flags, en particulier le FLAG "Z". Le flag Z est mis à 1 si le test renvoie 0, à 0 sinon.
 
JNZ veut dire Jump if Not Zero. Cela crée un saut si le flag est à 0... (Si le FLAG est à 0... c'est qu'on a pas 0...)
 
Dis, dis, Pralinor, toi, qui sait plein de choses, qu'est-ce ça fait : Pour rappel (enfin pour ceux qui suivent encore), dans EBP nous avions mis le résultat du test sur l'armure. Nous avons donc 0 si l'objet était une arme, et 1 si l'objet était une armure. Le corollaire de cela, c'est la valeur dans EAX. Si EBP = 0, alors EAX = 1 (si ce n'est pas une armure, c'est une arme), et si EBP = 1 alors EAX = 0...
Si vous avez suivi toutes les explications, si c'est une arme, EBP = 0, et donc Z = 1, et donc le saut n'est pas pris. Le contraire si c'est l'armure.


Message édité par pralinor le 16-11-2007 à 22:39:53
n°14286
pralinor
Lightwave's 999ers
Posté le 16-11-2007 à 21:13:13  profilanswer
 

OK, on continue dans ce post ^_^
 

TEST EAX,EAX
JE D2Game.04792D1B


 
Dis, dis, Pralinor, toi, qui sait plein de choses, qu'est-ce ça fait: Bon, si c'est une arme on va faire ce test. rien de nouveau sous le soleil.  On test EAX (donc l'arme) et on vérifie qu'il s'agit d'une arme. Si EAX =  on0 sorty de la routine. Ca ne concerne ni une arme ni une armure.
 

PUSH EDI
CALL <JMP.&D2Common.#10792>


 
Dis, dis, Pralinor, toi, qui sait plein de choses, qu'est-ce ça fait : HONTE SUR PRALINOR. Les fonctions ayant changé de nom (encore une fois), je n'ai pas été voir ce que ça fait.  :cry:  Mais bon, je ne serais pas surpris que ce soit le indestructible... Je vérifierai plus tard.
 

TEST EBP,EBP
PUSH EBX
MOV EBX,4
JNZ SHORT D2Game.04792AF8


 
Un peu d'assembleur : Rien de nouveau sous le soleil de mars.
 
Dis, dis, Pralinor, toi, qui sait plein de choses, qu'est-ce ça fait : Je rappelle que dans EBP on a sauvegardé l'armure. On sauvegarde le registre EBX, et on met 4 dedans... Ah ah !!!
Si vous avez tout suivi (hé hé hé) je vous laisse deviner ce qui se passe sur le JNZ (pour les autres le spoiler en dessous c'est bien).
 

Spoiler :

Rappelons que si c'est une armure EBP = 1. Si EBP = 1, TEST EBP, EBP renvoie 1, donc le flag Z est à 0 (on suit toujours ???). Si le FLAG Z est à 0, alors le JUMP est pris


 
La suite pour tout le monde.
 

PUSH EDI
CALL <JMP.&D2Common.#10955>
TEST EAX,EAX
JE SHORT D2Game.04792AFD
MOV EAX,DWORD PTR SS:[ESP+14]
MOV ECX,DWORD PTR DS:[EAX+70]
TEST ECX,ECX
JE D2Game.04792D1A
MOV EBX,0A
MOV EAX,DWORD PTR DS:[ESI+20]
MOV ECX,6AC690C5
MUL ECX
MOV ECX,DWORD PTR DS:[ESI+24]
XOR EBP,EBP
ADD EAX,ECX
ADC EDX,EBP
MOV DWORD PTR DS:[ESI+24],EDX
XOR EDX,EDX
MOV ECX,64
MOV DWORD PTR DS:[ESI+20],EAX
DIV ECX


 
Voici une longue section sur laquelle je ne vais pas m'arrêter. Sauf ceci : MOV EBX, 0A. Si c'est une armure on met 10 dans EBX (contre 4 contre une arme).
Le problème de cette section, c'est que nous sommes face à des maths en assembleur et je crains franchement perdre mes quelques lecteurs qui suivent encore... J'essaierai de faire une section l'assembleur même pas peur pour expliquer ces concepts.  
Disons ceci pour simplifier : On cherche un tirer un nombre aléatoire compris en 1 et 64 en hexa (donc 100). La valeur tirée est mise dans EDX.
 

CMP EDX,EBX


 
un peu d'assembleur : Pour CMP je renvoie à mes explications sur le post ITD/RTD (fonction rechercher). Ca réalise la comparaison entre EDX et EBX.  
 
Dis, dis, Pralinor, toi, qui sait plein de choses, qu'est-ce ça fait : Rappelons mes amis, rappelons :  dans EDX, on a le chiffre aléatoire du précédent algorithme (que vous maitrisez parfaitement ^_^), dans EBX 4 pour une arme, 10 pour une armure.
 

JGE D2Game.04792D1A
PUSH EBP
PUSH 48
PUSH EDI
CALL <JMP.&D2Common.#10061>


 
Ah on arrive à la fin...
 
Un peu d'assembleur : JGE Jump Greater or Equal se rapporte au CMP. Si EDX > EBX le JGE est pris.
 
Dis, dis, Pralinor, toi, qui sait plein de choses, qu'est-ce ça fait : C'est très simple on compare les valeurs armes et armures (4 et 10) et on les compare à un chiffre aléatoire en 1 et 100. si le chiffre aléatoire est plus grand, circulez.  
 
Sinon... On appelle la fonction 10061 avec 48. un petit coup d'oeil au fichier MPQ, onglet ItemStatCost, valeur 48 nous apprendra durability...
 
NB : c'est comme ça que j'ai repéré la fonction à titre indicatif ^_^
 
Ce qui nous amène fatalement ici :
 

MOV EBP,EAX
DEC EBP


Dis, dis, Pralinor, toi, qui sait plein de choses, qu'est-ce ça fait : Le résultat de la précédente fonction (donc la durabilité de l'arme ou armure) est diminuée de 1.
 
 
Conclusion : La durabilité décroit de 1 en fonction du type .  
Une arme à 4% de chance de perdre une durabilité/ coup.
Une armure 10%.
 
Voilà où l'on voulait arriver ^_^.


Message édité par pralinor le 16-11-2007 à 22:41:19
n°14287
athara
ollydebugger
Posté le 16-11-2007 à 21:53:01  profilanswer
 

Très très bonne initiative :hello:  
Même si je pense que ça toucherait plus de monde dans D2 & LOD, mais bon ça peut se déplacer...
 
Si besoin je supprime ce post sans problème.

n°14288
pralinor
Lightwave's 999ers
Posté le 16-11-2007 à 22:22:18  profilanswer
 

C'est bon, tu peux laisser.  
 
Mais ça a sa place ici. ^_^
 
Je fais la mise en page et j'ajoute les liens. Je khaurije lé phôtte.

n°14289
ToTo07
/facepalm
Posté le 17-11-2007 à 09:14:31  profilanswer
 

un ENORME bravo a toi ;)


---------------
MULTI-PAF'S : 1 constance :D   2 sho  3 tetlouze :evil: 4 cafard :evil:  5 xono  6  xono² 7 waznoth 8 waznoth² 9 cafard²  10 tetlouze²   11 Mezzi  12 moi-même :sol: 13 aurox 14 gandalf
qui veut gagner des bonbons  i love this video   plus court TT : 19 secondes, merci ******* ^^ :ack: :razz: poesie :)
Mon mod pour d2 : v1.11[ABANDONNE]   OLOLOLOL²² TeTlis flood  KolleKtor  
La loi de Murphy, c'est l'Histoire de ma vie  
n°14290
pralinor
Lightwave's 999ers
Posté le 18-11-2007 à 16:38:43  profilanswer
 

Pas de problème, ravi que ça vous plaise ^_^

n°14291
Diacred
The Lines Are Back... © Julia
Posté le 20-11-2007 à 16:11:14  profilanswer
 

J'ai encore jamais rien compris à l'assembleur, pas que j'ai pas essayé hein :ack:
 
Faudrait que je trouve le temps de m'y mettre sérieusement un jour.
 
En tout cas, ça à l'air d'être un travail de qualité, donc gratz :)


---------------
"Franchement, change de classe, change de bahut, change de pays, la concentration de boulets que tu te trimballes c'est inhumain." ©TL :love: ..::.. Envie de vous vider la tête? .::. De la paraphilie .::.
La fabrique de smiley ..::.. Le Topic Du Pen Spinning :D ..::..  Nous sommes tous wayne :evil:
n°14292
ToTo07
/facepalm
Posté le 20-11-2007 à 16:31:20  profilanswer
 

nan, si t'as rien compris c'est pacque t'es bete ( :ack: inside of course :o )
 
moi, j'ai tout compris alors que j'ai presque jamais touché a l'assembleur

Message cité 1 fois
Message édité par ToTo07 le 20-11-2007 à 16:31:29

---------------
MULTI-PAF'S : 1 constance :D   2 sho  3 tetlouze :evil: 4 cafard :evil:  5 xono  6  xono² 7 waznoth 8 waznoth² 9 cafard²  10 tetlouze²   11 Mezzi  12 moi-même :sol: 13 aurox 14 gandalf
qui veut gagner des bonbons  i love this video   plus court TT : 19 secondes, merci ******* ^^ :ack: :razz: poesie :)
Mon mod pour d2 : v1.11[ABANDONNE]   OLOLOLOL²² TeTlis flood  KolleKtor  
La loi de Murphy, c'est l'Histoire de ma vie  
n°14293
pralinor
Lightwave's 999ers
Posté le 20-11-2007 à 16:40:49  profilanswer
 

^_^ Ce n'est pas toujours évident au premier coup d'oeil l'assembleur, mais ce n'est pas plus dur qu'autre chose. Et quand on veut s'y mettre les petites fonctions que je deboggue pour vous sont idéales.
 
Je choisis des choses qui ne sont pas trop dans les tables. Comme le ITD, ici la durabilité ou le ralentissement que je prépare (par contre on ira peut-être dans les tables ce coup-ci... héhé).
 
Et s'il y a des choses que vous ne comprenez pas. ben zou : un mp ou vous postez ici. La denière fois j'avsi expliqué en détail le fonctionnement des instructions TEST et CMP suite à quelques mp.
 
La moralité c'est : L'assembleur, même pas peur.
 
PS : Hé oui, c'est un travail de qualité, nomého ^__^


---------------
Le savoir ne vaut que s'il est partagé : FAQ des nécros.
Technique : Configuration clavier --- Les sorts d'os.
D2 en assembleur: La qualité d'un objet I  [:manureva:9]  --- Ralenti l'ennemi --- La perte de durabilité ----- Le ITD
Théorie: Les maths -- TEST/CMP/Les jumps -- La pile
n°14294
Diacred
The Lines Are Back... © Julia
Posté le 20-11-2007 à 17:10:10  profilanswer
 

ToTo07 a écrit :

nan, si t'as rien compris c'est pacque t'es bete ( :ack: inside of course :o )
 
moi, j'ai tout compris alors que j'ai presque jamais touché a l'assembleur


Surtout pacque en ce moment j'ai pas le temps.
 
Non, mais j'avais essayer de comprendre la théorie de l'assembleur ( avec les bus mémoire et la pseudo superposition des trucs à leur adresse ) et sté vachement complexe, ça m'avait un peu découragé et comme en plus j'ai le temps de bosser dessus que les vacances... :D


---------------
"Franchement, change de classe, change de bahut, change de pays, la concentration de boulets que tu te trimballes c'est inhumain." ©TL :love: ..::.. Envie de vous vider la tête? .::. De la paraphilie .::.
La fabrique de smiley ..::.. Le Topic Du Pen Spinning :D ..::..  Nous sommes tous wayne :evil:
n°14298
pralinor
Lightwave's 999ers
Posté le 23-11-2007 à 18:57:05  profilanswer
 

Bon ben, on ne va pas s'arrêter en si bon chemin, et on va aller regarder de plus près la pile... ^_^
 
La pile dans la vie de tous les jours.
 
On a de la chance de la chance (ça arrive). La pile dans la vie de tous les jours, c'est comme une pile informatique, on ne va donc pas se priver de faire un petit parallèle. Je note que par pile il faut comprendre pile d'assiette, et non pile pour mettre dans votre dernier lecteur mp3.
 
Donc prenons une pile d'assiette. Les assiettes sont les unes au-dessus des autres, elles sont donc empilées. Un petit schéma pour comprendre :
 


__3__
__2__
__1__


 
Ici j'ai empilé 3 assiettes (nommées 1, 2, 3). On peut facilement accèder à l'assiette 3... Mais pas trop à la 1. Je peux faire 2 opérations simples :
 
1 - enlever l'assiette 3 de la pile.


     - - - - -
__2__         |
__1__       __3__


 
Comme je l'ai fait sur la petite capture ici. (Ca rox comme schéma... o_O)
 
Tout au contraire, je peux remettre l'assiette 3 sur la pile.
 


__3__<- - - - -
__2__          |
__1__      


 
Ces opérations s'appellent empiler (mettre sur la pile) et dépiler (enlever de la pile). Ben ça ça tombe bien, parce qu'une pile informatique ça fonctionne mot pour mot comme ça !
 
La pile en informatique.
 
En informatique (ce n'est pas spécifique à l'assembleur), une pile est une zone dite LIFO, pour Last In First Out.  En clair le premier arrivé est le dernier servi. Regardez bien que je n'arriverais à l'assiette 1 qu'en dépilant la 3 puis la 2. La 1 est donc bien traitée en dernier, tout en étant la première assiette de la pile.
 
NB : Il existe aussi des files (FIFO : First in First out), mais l'assembleur ne sait pas ce que c'est (enfin les microprocesseurs PC ne savent pas plus exactement). Donc : Soyez heureux...
 
Mais plutôt que de se lancer dans un long barratin, nous allons aller voir sous OllyDBG cette fameuse pile. Nous y verrons comment elle fonctionne et bien sûr son utilité.


Message édité par pralinor le 23-11-2007 à 19:45:59

---------------
Le savoir ne vaut que s'il est partagé : FAQ des nécros.
Technique : Configuration clavier --- Les sorts d'os.
D2 en assembleur: La qualité d'un objet I  [:manureva:9]  --- Ralenti l'ennemi --- La perte de durabilité ----- Le ITD
Théorie: Les maths -- TEST/CMP/Les jumps -- La pile
n°14299
pralinor
Lightwave's 999ers
Posté le 23-11-2007 à 18:57:46  profilanswer
 

La pile sous OllyDBG.
 
La pile est une zone très importante. Et OllyDBG ne manque pas de l'afficher en permanence. Cette capture nous montre la pile. Tout le monde aura compris que c'est la zone que j'ai entouré en rouge.
 
Comme on peut le voir, la pile est assez simple : Il y a une adresse mémoire (pour moi 002382C8 pour la première adresse) et une valeur associée à cette adresse (pour moi 02F02500). Ces valeurs seront plus que probablement différentes pour vous.
 
Maintenant comment est piloté cette pile ? Comme tout ce qui pilote l'assembleur, c'est un registre. Et plus précissement le registre ESP.  
 
La capture suivante nous montre d'ailleurs très bien que la valeur de ESP = La valeur du début de la pile.
 
http://www.pralinor.net/DiabloII/Ass/La%20Pile%202.png
 
Il nous reste maintenant à expliquer comment fonctionne la pile.


Message édité par pralinor le 23-11-2007 à 19:46:57

---------------
Le savoir ne vaut que s'il est partagé : FAQ des nécros.
Technique : Configuration clavier --- Les sorts d'os.
D2 en assembleur: La qualité d'un objet I  [:manureva:9]  --- Ralenti l'ennemi --- La perte de durabilité ----- Le ITD
Théorie: Les maths -- TEST/CMP/Les jumps -- La pile
n°14300
pralinor
Lightwave's 999ers
Posté le 23-11-2007 à 19:04:55  profilanswer
 

Empiler.
 
Comme on l'a vu sur l'exemple de l'assiette, les principales manoeuvres sur la pile sont : l'empilement et le dépilement.
 
On va donc regarder du côté de l'empilement. Et pour ça, je me suis remis sous OllyDBG au niveau de la fonction durabilité (étudiée dans ce post...) juste avant l'appel à la 2ème fonction 10890 (on verra pourquoi plus tard ^_^ J'aime bien aménager un petit peu de suspens...).
 
http://www.pralinor.net/DiabloII/Ass/La%20Pile%203.png
 
Pour se simplifier la capture, j'ai isolé le code (entouré en rouge), les registres (on verra pourquoi plus tard) et bien sûr la pile.
 
Alors le code est simple :
 

PUSH 2D
PUSH EDI
CALL 10890


 
Vraiment facile.
 
Tout d'abord regardons ce que fait le push 2D. Je l'execute :
 
http://www.pralinor.net/DiabloII/Ass/La%20Pile%204.png
 
Vous remarquerez que dans le haut de la pile, 2D est venu s'afficher (on a donc bien empilé la valeur 2D).  
 
J'exécute maintenant le PUSH EDI.
http://www.pralinor.net/DiabloII/Ass/La%20Pile%205.png
 
Tout d'abord, si vous regardez dans la capture du code, vous pourrez voir que le registre EDI = 02F9EC00, et que la valeur que l'on retrouve sur la pile est 02F9EC00. On a donc bien empilé la valeur du registre EDI.
 
2 constations :
1- On peut donc empiler soit des valeurs directes (le 2D), soit des valeurs composées (registres, qui ici est un pointeur qui pointe vers un objet)
2- Observez les adresses de la pile : Le 2D est à l'adresse : 002382C0; le 02F9EC00 002382BC. Vous pouvez donc voir que la plus haute valeur de la pile a l'adresse la plus basse (regardez bien ma capture, et simplement chez vous). C'est le fonctionnement inverse d'une zone mémoire donc. On commence par remplir la pile par le bas (la plus haute zone mémoire) et au fur et à mesure on empile sur des zones mémoires qui se situent avant. A noter qu'une zone de pile est sur 4 octets (on est en 32 bits, 1 octet = 8 bits ==> 4 octets [4*8=32... sic!]).
 
Voilà, je pense que c'est clair sur l'empilement ^_^
 
Le dépilement.
 
Bon, là je crois que c'est facile et que tout le monde aura compris. On utilise en lieu et place de PUSH l'instruction POP.  
 
La pile : Ca sert à quoi ?
 
Bon maintenant, on sait empiler, on sait dépiler. On sait que l'on peut empiler des valeurs, ou des pointeurs, qu'une zone de pile fait 4 octets. Mais on en fait quoi de ce savoir ???
 
==> On lit le prochain post ^_^


Message édité par pralinor le 23-11-2007 à 19:51:17

---------------
Le savoir ne vaut que s'il est partagé : FAQ des nécros.
Technique : Configuration clavier --- Les sorts d'os.
D2 en assembleur: La qualité d'un objet I  [:manureva:9]  --- Ralenti l'ennemi --- La perte de durabilité ----- Le ITD
Théorie: Les maths -- TEST/CMP/Les jumps -- La pile
n°14301
pralinor
Lightwave's 999ers
Posté le 23-11-2007 à 19:20:10  profilanswer
 

Utilisation de la pile
 
Vous aurez remarqué je suppose que en assembleur on aime travailler sur les registres (EAX, EBX, etc.) Vous aurez également remarqué que des registres... Ben y en a pas des masses. Du coup on est un peu embêté. Et faire des calculs ne va pas être des plus simples. Du coup, il faut trouver une solution.
 
Tout le monde l'aura compris, on va utiliser la pile. Plusieurs options s'offrent à nous. Celle de Diablo 2 est de se préparer des registres libres en les sauvegardant dans la pile en début de fonction. Illustration : Nous sommes dans le début de la fonction 10890 (qui cherche à savoir si notre objet est du type xxx).
 

PUSH EBX
MOV EBX,DWORD PTR SS:[ESP+8]
TEST EBX,EBX
JNZ SHORT D2Common.6FDC1B8F


 
La fonction commence par PUSH EBX. On empile donc EBX. Puis regardez : on vient mettre une valeur dans EBX par un MOV (peut importe la valeur). Ce qui est intéressant c'est la sauvegarde du registre EBX, pour libérer ce registre qui peut donc devenir un registre de travail ! Ce genre d'astuce est utilisé en permanence dans le code. Dès le début de la fonction, on sauvegarde les registres qui vont être utilisés par la suite.
 
Certes, c'est bien tout ça, mais quid de ces registres ?
Je vous montre l'une des sorties de la fonction 10890 (il y en a d'autres possibles, mais elles sont équivalentes) :

JNZ SHORT D2Common.6FDC1C07
POP EDI
POP ESI
XOR EAX,EAX
POP EBX
RETN 8


 
Regardez bien les nombreux POP que vous avez (dont un POP EBX...). Ces POP servent à restaurer les registres qui ont été altérés par la fonction.
 
Ceci nous amène donc à ==>
 
L'architecture général de D2.
 
Toutes les fonctions répondent à cette norme. Lors de l'appel d'une fonction, on sauvegarde dans la pile les paramètres d'appel (par exemple dans le cas de la fonction 10890 : l'objet à étudier, et le type d'objet). Dans la fonction appelée, on sauvegarde sur la pile les registres qui seront utilisés dans la fonction (voir mes explications au-dessus). Avant le retour à la fonction appelante, on restaure les registres et on place dans EAX le résultat de la fonction. A quelques exceptioins près, D2 fonctionne toujours ainsi.
 
Une exception.
 
Bon, comme en français, l'exception confirme la règle. Et fort justement la fonction 10890 présente l'avantage d'une exception.  
 

PUSH EDI
PUSH EAX
CALL D2Common.#11147


 
Dans le petit bout de code présenté, on ne voit rien d'anormal. On appelle un fonction 11147 en lui passant 2 paramètres.
 
Si ça vous intéresse, on lui passe le pointeur de l'objet et le type de l'objet. Le fonction vous ramène un nombre héxa. Par exemple, pour une hache de berserk, ça me ramène 1C. Sachez que cette fonction vous ramène le type d'objet. Bon, comme je n'avais pas prévu initialement cette analyse les fichiers MPQ que j'ai livré ne suffisent pas. Ce que la fonction vous rend c'est le ItemType. Donc pour une hache de Berserk : 1C, qui est une "Axe". Techniquement, on voit bien que la fonction qui sert à savoir si un objet A est du type X commence par rechercher le type d'objet. Toutefois, comme on cherche un type très général (à savoir any weapon), la recherche sur Axe ne sera pas suffisante, faudra faire d'autres tests.
 
Mais là n'est pas l'intérêt... On va aller voir... La fonction 11147... Et elle est très belle.
 

MOV EAX,DWORD PTR SS:[ESP+4]
CMP EAX,DWORD PTR DS:[6FDEFB10]
JNB SHORT D2Common.6FDC1447
MOV ECX,DWORD PTR DS:[6FDEFB14]
TEST ECX,ECX
JNZ SHORT D2Common.6FDC143D
PUSH 1EF
JMP SHORT D2Common.6FDC144C
IMUL EAX,EAX,1A8
ADD EAX,ECX
JNZ SHORT D2Common.6FDC1466
PUSH 68E
CALL <JMP.&Fog.#10265>
PUSH EAX
PUSH D2Common.6FDDA6F4
CALL <JMP.&Fog.#10024>
ADD ESP,0C
PUSH -1
CALL D2Common.6FD51B0D
MOVSX EAX,WORD PTR DS:[EAX+11E]
RETN 4
XOR EAX,EAX
RETN


 
Vous le remarquerez rapidement : Aucune sauvegarde de registre. Notez que la fonction est extremement brève au passage. (Techniquement, on est en train de lire des tables... vous savez les .mpq... Ben là, cette fonction, elle est en train de les lire... On verra ça un autre jour).
 
Conclusion.
 
Bon ben vous êtes des pros de la pile. On en a vu la théorie, et l'utilisation pratique dans D2. On en a profité aussi pour voir l'aspect général du jeu, et même à faire des incursions très profonde dans le code.
 
Voilà, la prochaine fois on étudiera... Ben autre chose ^_^


Message édité par pralinor le 23-11-2007 à 19:56:23

---------------
Le savoir ne vaut que s'il est partagé : FAQ des nécros.
Technique : Configuration clavier --- Les sorts d'os.
D2 en assembleur: La qualité d'un objet I  [:manureva:9]  --- Ralenti l'ennemi --- La perte de durabilité ----- Le ITD
Théorie: Les maths -- TEST/CMP/Les jumps -- La pile
n°14303
ToTo07
/facepalm
Posté le 23-11-2007 à 19:45:05  profilanswer
 

j'ai hate ^^

 

edit : a bah il a edité quand je lisais ^^


Message édité par ToTo07 le 23-11-2007 à 19:45:28

---------------
MULTI-PAF'S : 1 constance :D   2 sho  3 tetlouze :evil: 4 cafard :evil:  5 xono  6  xono² 7 waznoth 8 waznoth² 9 cafard²  10 tetlouze²   11 Mezzi  12 moi-même :sol: 13 aurox 14 gandalf
qui veut gagner des bonbons  i love this video   plus court TT : 19 secondes, merci ******* ^^ :ack: :razz: poesie :)
Mon mod pour d2 : v1.11[ABANDONNE]   OLOLOLOL²² TeTlis flood  KolleKtor  
La loi de Murphy, c'est l'Histoire de ma vie  
n°14304
pralinor
Lightwave's 999ers
Posté le 23-11-2007 à 19:58:08  profilanswer
 

Faut korrighait l'haurthaugrafe, faire la mise en page, vérifier les images et les liens ^_^ C'est ce que je faisais à l'instant


---------------
Le savoir ne vaut que s'il est partagé : FAQ des nécros.
Technique : Configuration clavier --- Les sorts d'os.
D2 en assembleur: La qualité d'un objet I  [:manureva:9]  --- Ralenti l'ennemi --- La perte de durabilité ----- Le ITD
Théorie: Les maths -- TEST/CMP/Les jumps -- La pile
n°14306
ToTo07
/facepalm
Posté le 25-11-2007 à 20:43:16  profilanswer
 

j'ai réinstallé D2, connaitrais-tu quelque chose qui soit facile (et utile si possible :whistle: ) pour que je m'entraine ?


---------------
MULTI-PAF'S : 1 constance :D   2 sho  3 tetlouze :evil: 4 cafard :evil:  5 xono  6  xono² 7 waznoth 8 waznoth² 9 cafard²  10 tetlouze²   11 Mezzi  12 moi-même :sol: 13 aurox 14 gandalf
qui veut gagner des bonbons  i love this video   plus court TT : 19 secondes, merci ******* ^^ :ack: :razz: poesie :)
Mon mod pour d2 : v1.11[ABANDONNE]   OLOLOLOL²² TeTlis flood  KolleKtor  
La loi de Murphy, c'est l'Histoire de ma vie  
n°14307
pralinor
Lightwave's 999ers
Posté le 25-11-2007 à 21:02:00  profilanswer
 

Ben tout dépend ce que tu appelles utile ^_^ Le jeu est bourré de choses faciles à faire.  Après l'utilité... Pour moi, c'est de la pure curiosité, et puis j'aime bien savoir comment ça marche. Mais bon. Voici un truc utile : le ralentissement max. Et un résultat je suis sûr pas connu ^_^.
 
Je t'ai extrait le début de la fonction :
 

SUB ESP,24
PUSH EBX
PUSH EDI
MOV EDI,DWORD PTR SS:[ESP+30]
TEST EDI,EDI


 
Ce devrait suffire à localiser. Cette fonction est excellente puisqu'elle permet de lire les tables des boss, des uniques, de mercs et d'identifier les champions, et autres possédés. A chaque fois, elle met un max au ralentissement. Tu peux t'amuser sur ça ^_^.
 
Enfin, il y en a des choses à faire !!!!
 
NB : J'en déduis au passage que tu ne fais plus ton mod... O_O


---------------
Le savoir ne vaut que s'il est partagé : FAQ des nécros.
Technique : Configuration clavier --- Les sorts d'os.
D2 en assembleur: La qualité d'un objet I  [:manureva:9]  --- Ralenti l'ennemi --- La perte de durabilité ----- Le ITD
Théorie: Les maths -- TEST/CMP/Les jumps -- La pile
n°14308
ToTo07
/facepalm
Posté le 25-11-2007 à 21:08:15  profilanswer
 

merci pour la fonction (meme s'il faut que je réapprennes a me servir de ollyDBG, je sais meme plus ouvrir les dll :'( :ack: )

 

pour mon mod, personne n'y jouais mais il n'est pas exclu que je recommence ;)

 

edit : rofl je sais meme plus comment faire pour trouver le bout de machin que tu donne :/

 

re-edit : c'est bon je crois que je l'ai trouvé (note a moi-meme car go dodo : 01FF63A0 )


Message édité par ToTo07 le 25-11-2007 à 21:24:27

---------------
MULTI-PAF'S : 1 constance :D   2 sho  3 tetlouze :evil: 4 cafard :evil:  5 xono  6  xono² 7 waznoth 8 waznoth² 9 cafard²  10 tetlouze²   11 Mezzi  12 moi-même :sol: 13 aurox 14 gandalf
qui veut gagner des bonbons  i love this video   plus court TT : 19 secondes, merci ******* ^^ :ack: :razz: poesie :)
Mon mod pour d2 : v1.11[ABANDONNE]   OLOLOLOL²² TeTlis flood  KolleKtor  
La loi de Murphy, c'est l'Histoire de ma vie  
n°14309
pralinor
Lightwave's 999ers
Posté le 25-11-2007 à 22:35:04  profilanswer
 

Tu fais ctrl  + S et tu mets le code que j'ai donné. Ca devrait suffire, je pense.
 
Faire un mod à D2 ça demande pas mal de temps. Ce jeu n'a pas été fait pour, ceci explique cela.
 
Cela dit bon courage pour le Code reading ^_^


---------------
Le savoir ne vaut que s'il est partagé : FAQ des nécros.
Technique : Configuration clavier --- Les sorts d'os.
D2 en assembleur: La qualité d'un objet I  [:manureva:9]  --- Ralenti l'ennemi --- La perte de durabilité ----- Le ITD
Théorie: Les maths -- TEST/CMP/Les jumps -- La pile
n°14310
Acrerune
Tavernier trembleur (¯`·._.·»
Posté le 25-11-2007 à 23:41:55  profilanswer
 

Bravo Prali, même si franchement, ça me dépasse!


---------------
[:acrerune:4][:acrerune:5][:acrerune:6][:acrerune:7]  
 ¤  L’Oracle des runes  ¤   Wikirune  ¤   Le savoir ne vaut que s'il est partagé par tous  ¤   Mon weblog
"Sicarios, con la ayuda de otros zelotas [...] cometieron una serie de atrocidades, para forzar a la población a luchar."
n°14311
pralinor
Lightwave's 999ers
Posté le 26-11-2007 à 08:21:54  profilanswer
 

L'important c'est le résultat, le reste c'est de la technique ^_^


---------------
Le savoir ne vaut que s'il est partagé : FAQ des nécros.
Technique : Configuration clavier --- Les sorts d'os.
D2 en assembleur: La qualité d'un objet I  [:manureva:9]  --- Ralenti l'ennemi --- La perte de durabilité ----- Le ITD
Théorie: Les maths -- TEST/CMP/Les jumps -- La pile
n°14312
ToTo07
/facepalm
Posté le 26-11-2007 à 18:34:40  profilanswer
 

- Si je recommence a modder, ce sera uniquement a partir des idees des futurs joueurs (et je recommencerais le mod a zero)

 

- Pour la sequence que tu m'a donné, es-tu sur que ca a un rapport avec le ralentissement ? En effet, la breakpoint ne fait rien quand j'utilise ma soso glace !


Message édité par ToTo07 le 26-11-2007 à 18:34:56

---------------
MULTI-PAF'S : 1 constance :D   2 sho  3 tetlouze :evil: 4 cafard :evil:  5 xono  6  xono² 7 waznoth 8 waznoth² 9 cafard²  10 tetlouze²   11 Mezzi  12 moi-même :sol: 13 aurox 14 gandalf
qui veut gagner des bonbons  i love this video   plus court TT : 19 secondes, merci ******* ^^ :ack: :razz: poesie :)
Mon mod pour d2 : v1.11[ABANDONNE]   OLOLOLOL²² TeTlis flood  KolleKtor  
La loi de Murphy, c'est l'Histoire de ma vie  
n°14313
athara
ollydebugger
Posté le 26-11-2007 à 18:44:02  profilanswer
 

C'est parce que c'est le ralentissement du gogo d'argile (ou d'une arme du merco dont je me souviens plus du nom ?), voire de décrepit (quoiqu'il s"agit d'une fonction à part peut-être :hmm:).
Mais pas le gel des monstres

n°14314
ToTo07
/facepalm
Posté le 26-11-2007 à 18:52:41  profilanswer
 

ah ok [:ackdeblonde]  
 
EDIT : bon je crois que je vais laisser tomber, pacque SUB, SHR et les machins DWORD blabla je comprends rien et je vois pas a quoi correspondent les EBX et compagnie :/


Message édité par ToTo07 le 26-11-2007 à 19:02:00

---------------
MULTI-PAF'S : 1 constance :D   2 sho  3 tetlouze :evil: 4 cafard :evil:  5 xono  6  xono² 7 waznoth 8 waznoth² 9 cafard²  10 tetlouze²   11 Mezzi  12 moi-même :sol: 13 aurox 14 gandalf
qui veut gagner des bonbons  i love this video   plus court TT : 19 secondes, merci ******* ^^ :ack: :razz: poesie :)
Mon mod pour d2 : v1.11[ABANDONNE]   OLOLOLOL²² TeTlis flood  KolleKtor  
La loi de Murphy, c'est l'Histoire de ma vie  
n°14316
pralinor
Lightwave's 999ers
Posté le 26-11-2007 à 19:02:58  profilanswer
 

non faux tous les 2.
 
Par contre, je pense que si tu mets une arme avec le mode ralenti l'ennemi de x%... Tu va obtenir quelque chose. (Rien à voir avec le merc).
 
D'ailleurs, rien à voir avec décrepit.
 
Pour étudier le code, il faut étudier des petits bouts faciles, que l'on sait faire. Les combos type holy freeze/decrepit/slow down... C'est pas pour tout de suite ^_^
 
Les maleds comme les auras utilisent leurs propres fonctions. Enfin, disons que c'est facile de dire ça, mais c'est vrai. Peut-être un jour, si je suis décidé (ou si Myrdinn repasse...), on ira faire un tour par là.
 
EDIT : SUB ==< subtract
SHR : Registre de décalage à droite
 
La première instruction SUB ESP,24...
ESP, c'est quoi ? TU AS LA REPONSE... sinon, le la pile dans ma signature va t'aider...
Donc on soustrait 24 à la pile... Pépouse
 
Dans EBX  00 00 00 00 02 00 00 00 ==> joueur (00 00 00 00) de type nécro (02 00 00 00). Je ne joue que des nécros ^_^
Donc, là on sauvegarde le registre
Dans EDI, il y a un truc, mais on ne sait pas ce que c'est a priori
 
ensuite : MOV EDI, blabla
Blazbla c'est ESP +30... ESP, c'est ??? Oui... ma signature, la pile
+30 ben c'est la valeur de la pile +30
Ca nous ramène encore le pointeur du nécro.
 
etc.
 
cela dit, je suis loin d'avoir montré assez de concepts en assembleurs ^_^ On n'a pas encore vu les opcodes... du coup, on n'a pas vu l'endianess... ce qui fait que les offsets... ben on ne sait pas ce que c'est ! Et que donc, les pointeurs, mystère et trognon de chou.
Je passe bien sûr sur les registres et registres étendus à 64 bits, les flags...
 
NB final : plutôt que d'essayer une fonction que tu ne connais pas... essaye une fonction que tu connais... Au hasard, la perte de durabilité. Ca aide de suivre quelqu'un pas à pas pour bien comprendre. Et pose des questions si tu as besoin.

Message cité 2 fois
Message édité par pralinor le 26-11-2007 à 19:11:32

---------------
Le savoir ne vaut que s'il est partagé : FAQ des nécros.
Technique : Configuration clavier --- Les sorts d'os.
D2 en assembleur: La qualité d'un objet I  [:manureva:9]  --- Ralenti l'ennemi --- La perte de durabilité ----- Le ITD
Théorie: Les maths -- TEST/CMP/Les jumps -- La pile
n°14317
ToTo07
/facepalm
Posté le 26-11-2007 à 19:06:56