[ASM-Nasm] Problème de comparaison nombre

Problème de comparaison nombre [ASM-Nasm] - ASM - Programmation

Marsh Posté le 11-02-2009 à 11:29:09    

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:


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

Marsh Posté le 11-02-2009 à 11:29:09   

Reply

Marsh Posté le 11-02-2009 à 11:51:01    

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

Reply

Marsh Posté le 11-02-2009 à 11:52:48    

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

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

Marsh Posté le 11-02-2009 à 11:56:18    

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.

Reply

Marsh Posté le 11-02-2009 à 11:57:57    

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.


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

Marsh Posté le 11-02-2009 à 12:07:39    

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
Reply

Marsh Posté le 11-02-2009 à 15:54:33    

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


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

Marsh Posté le 11-02-2009 à 16:16:58    

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
Reply

Marsh Posté le 11-02-2009 à 16:26:26    

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é :(


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

Marsh Posté le 12-02-2009 à 09:32:58    

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:


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

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed