Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1865 connectés 

  FORUM HardWare.fr
  Programmation
  ASM

  [ASM-Nasm] Problème de comparaison nombre

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[ASM-Nasm] Problème de comparaison nombre

n°1849737
SyaoranLi
Posté le 11-02-2009 à 11:29:09  profilanswer
 

Bonjour, j'ai un petit soucis dans un tableau de nombres signés.
 
Je cherche à connaître le plus grand intervalle et le plus petit intervalle entre deux nombres consécutifs.
Seulement, pour le plus petit nombre, il me retourne la bonne valeur, et pour le plus grand il me fait la différence entre les deux extrême.. je ne comprends plus rien et je me casse le cul dessus depuis 4 heures :sweat:  :whistle:  
 
Voici le code :

Code :
  1. mov ECX,0       ; plus grand ecart
  2.         mov EDX,40000   ; plus petit ecart
  3.         mov ESI,table   ; adresse de debut de table dans ESI
  4. boucle3:
  5.         mov EDI,ESI     ; Copie du tableau
  6.         add EDI,4       ; Element suivant
  7. boucle4:
  8.         mov EAX,[ESI] ; Element actuel d'ESI
  9.         mov EBX,[EDI] ; Element actuel d'EDI
  10.         push EDX ; Sauvegarde d'EDX parce qu'il va se faire modifié par imul
  11.         sub EAX,EBX ; On regarde l'écart entre les deux
  12.         mov EBX,-1 ; On multiplie par -1 car on aura toujours une valeur neg.
  13.         imul EBX ; Multiplication..
  14.         pop EDX ; On restaure EDX pour après
  15.         cmp EAX,ECX ; On compare pour savoir le plus grand
  16.         ; si eax plus grand alors ecx = eax
  17.         jnl plusgrand
  18.         cmp EAX,EDX ; On compare pour savoir le plus petit
  19.         ; si eax plus petit alors edx = eax
  20.         jng pluspetit
  21.         jmp suite ; on continue vers suite
  22. plusgrand:
  23.         mov ECX,EAX
  24.         jmp suite
  25. pluspetit:
  26.         mov EDX,EAX
  27.         jmp suite
  28. suite:
  29.         add EDI,4 ; On augmente de 4 pour l'element suivant dans EDI
  30.         cmp EDI,taille ; On vérifie qu'on ne sort pas du tableau
  31.         jb boucle4 ; On ne dépasse pas donc on retourne à boucle4
  32.         add ESI,4 ; On augmente de 4 pour l'element suivant dans ESI
  33.         cmp ESI,taille-4 ; On vérifie qu'on ne sort pas du tableau
  34.         jb boucle3 ; On ne dépasse pas donc on retourne à boucle3


Voici mon .data :

Code :
  1. section .data
  2. table  DD -87,587,6874,-8762,20,1,0
  3. taille DD taille-table


 
 
Merci d'avance pour votre aide :jap:


---------------
私輪ジョアシェン
mood
Publicité
Posté le 11-02-2009 à 11:29:09  profilanswer
 

n°1849772
olivthill
Posté le 11-02-2009 à 11:51:01  profilanswer
 

Ne faudrait-il pas prendre la valeur absolue au lieu de multiplier par -1 ?

n°1849775
SyaoranLi
Posté le 11-02-2009 à 11:52:48  profilanswer
 

bah la multiplication par -1 ce n'est pas faire la valeur absolu d'un nombre négatif?
 
En fait ce que je comprend pas, c'est que dans EAX, mon nombre après le SUB, augmente non-stop.
 
Par exemple j'ai -5748 et -4. L'intervalle est de 5744, ok?
Mais par après j'ai -4 et 0. J'ai donc un intervalle de 4, ok?
 
Alors pourquoi cette intervalle n'est pas de 4, mais est supérieur à 5744?


Message édité par SyaoranLi le 11-02-2009 à 11:57:06

---------------
私輪ジョアシェン
n°1849784
olivthill
Posté le 11-02-2009 à 11:56:18  profilanswer
 

Sauf erreur, avec les données de l'exemple, on a EAX=-87, EBX=587. Puis EAX=587--87=674. Puis multiplication par -1 (?) ce qui donne -674 qui est comparé avec 0.

n°1849789
SyaoranLi
Posté le 11-02-2009 à 11:57:57  profilanswer
 

Arf j'ai oublié de dire que le tableau a été trié au part avant, donc les nombres sont dans l'ordre et j'ai bien que des nombres negatif lors du sub.


---------------
私輪ジョアシェン
n°1849803
olivthill
Posté le 11-02-2009 à 12:07:39  profilanswer
 

Donc, le tableau est  
table  DD -8762, -87,0, 1, 20, 1587,6874
(-87--8762)*-1 = -8575
puis la comparaison avec 0 donne 0 vainqueur.
Je crois qu'il faudrait initialiser CX à -4000, et je crois qu'il serait plus simple de prendre la valeur absolue avec quelque chose comme

boucle4:
     mov EAX,[ESI] ; Element actuel d'ESI
     mov EBX,[EDI] ; Element actuel d'EDI
     sub EAX,EBX ; On regarde l'écart entre les deux
     cmp EAX,EAX
     jns boucle4a
     neg EAX
boucle4a:
     cmp EAX,ECX ; On compare pour savoir le plus grand


Message édité par olivthill le 11-02-2009 à 12:49:20
n°1849947
SyaoranLi
Posté le 11-02-2009 à 15:54:33  profilanswer
 

quelle est le but de comparé EAX avec... lui même? on aura toujours le même résultat..


---------------
私輪ジョアシェン
n°1849960
olivthill
Posté le 11-02-2009 à 16:16:58  profilanswer
 

Le but est de positionner les flags, notamment le flag "S", pour savoir si le nombre est négatif. Mais je me suis peut-être trompé, et il vaut peut-être mieux utiliser l'instruction test que cmp ici.
Quoi qu'il en soit, il est encore plus simple de ne pas mettre ce cmp ou ce test car le sub met déjà à jour les flags.


Message édité par olivthill le 11-02-2009 à 16:23:09
n°1849963
SyaoranLi
Posté le 11-02-2009 à 16:26:26  profilanswer
 

Le problème avec ça, c'est que ça rend faux le plus petit, et pareille pour le plus grand, il y a une inversion de valeur (donc le plus grand est à 0, et le plus petit à -60000), mais le truc c'est que c'est impossible d'une part et d'autre part, valeur inversé :(


---------------
私輪ジョアシェン
n°1850168
SyaoranLi
Posté le 12-02-2009 à 09:32:58  profilanswer
 

Bon j'ai trouvé mes erreurs après une bonne nuit de sommeils :)
 
Cela venait du fait que ma loop loopait bien sur le nombre d'élément du tableau, mais mon pointeur dans EDI, lui, n'avançait pas à cause du simple fait que je ne l'incrémentait pas..
 
Comme quoi, a trop vouloir cherché on a du mal :)
 
 
Merci à toi olivthill pour m'avoir conseillé :jap:


---------------
私輪ジョアシェン

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  ASM

  [ASM-Nasm] Problème de comparaison nombre

 

Sujets relatifs
Problème avec If et Case dans VBA...Probleme sur Eclipse
[PHP] Problème Array : test de valeurs negatives de suite[RESOLU] [PHP/MYSQL] Problème d'exécution de requete imbriqué
probleme de control par gotoandstop sur une anim.swfprobleme mise en page de mon site
Problème de réceptions MulticastBehavior problème gestion souris molette + deplacement
Problème pattern Decorateur FilterInputStream et classe de test.probleme lors de l'envoie d'un email en php
Plus de sujets relatifs à : [ASM-Nasm] Problème de comparaison nombre


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR