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

  FORUM HardWare.fr
  Programmation
  ASM

  Comparaisons multiples

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Comparaisons multiples

n°289429
thenutskil​ler
1+1=3
Posté le 19-01-2003 à 15:12:59  profilanswer
 

Voilà mon pb:  
 

Si P=0 ou N=P  
alors
res=1
sinon
traitement
finsi

 
Or, je ne sais pas comment faire en assembleur (TASM 8086) pour que le programme prenne en compte les 2 comparaisons avant de faire un JMP suite.


Message édité par thenutskiller le 19-01-2003 à 16:24:53
mood
Publicité
Posté le 19-01-2003 à 15:12:59  profilanswer
 

n°289439
drasche
Posté le 19-01-2003 à 15:36:46  profilanswer
 

ben tu peux pas, tu ne peux faire qu'une seule comparaison à la fois, n'oublie pas que tu fais de l'assembleur ;)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°289443
thenutskil​ler
1+1=3
Posté le 19-01-2003 à 15:39:53  profilanswer
 

Si je fais ça:  
Code:  
 
si:  
        cmp bx, 0  
        jne sinon  
         
        cmp ax, bx  
        jne sinon  
         
        mov ax,1  
        jmp finsi  
sinon:  
        ...  
finsi:  
        ...
 
 
 
Le problème est que si bx est différent de 0 mais que ax=bx, le programme va quand à sinon... alors que je voudrais qu'il continue puisque ax=bx...

n°289456
bjone
Insert booze to continue
Posté le 19-01-2003 à 16:19:10  profilanswer
 

c'est quoi ton code en équivalent C ?
 
genre ça:
 
if( !a || !b )
{
   // code....
}

n°289457
thenutskil​ler
1+1=3
Posté le 19-01-2003 à 16:23:52  profilanswer
 

En fait, c'est  
 
if((p=0)||(n=p))
   {
   // code
   }
else
   {
   // code
   }

n°289467
bjone
Insert booze to continue
Posté le 19-01-2003 à 16:41:15  profilanswer
 

donc déjà tu peux retourner les conditions histoire de voir si ça t'arrange:
 
if( !p || n==p )  
{  
 // code 1
}  
else  
{  
 // code 2
}
 
est équivalent à:
 
if( p && n!=p )
{
  // code 2
}
else
{
  // code 1
}

n°289470
thenutskil​ler
1+1=3
Posté le 19-01-2003 à 16:45:50  profilanswer
 

ça ne me dit pas comment faire en assembleur...

n°289485
bjone
Insert booze to continue
Posté le 19-01-2003 à 17:10:21  profilanswer
 

la version optimisée:
 
mov ax,n  
sub ax,p  ; n-p
 
cmp ax,1  ; si n-p = 0, 0 étant inférieur à 1, la retenue sera mise sinon, la retenue sera à 0
 
sbb ax,ax ; ax => 0 si n==p, -1 (0xffff) si n!=p
           
and ax,p  ; ax => 0 si p est nul, quelque chose si p n'est pas nul
jz Code1 ; valà on si p est nul OU que n==p
 
; Code2
jmp fin
 
Code1:
 
fin:

n°289487
bjone
Insert booze to continue
Posté le 19-01-2003 à 17:13:00  profilanswer
 

sinon la version normale:
 
mov ax,p
or ax,ax
jz code1
cmp ax,n
je code1
 
;Code 2
jmp fin
 
code1:
 
fin:

n°289490
bjone
Insert booze to continue
Posté le 19-01-2003 à 17:18:47  profilanswer
 

BJOne a écrit :

la version optimisée:
 
mov ax,n  
sub ax,p  ; n-p
 
cmp ax,1  ; si n-p = 0, 0 étant inférieur à 1, la retenue sera mise sinon, la retenue sera à 0
 
sbb ax,ax ; ax => 0 si n==p, -1 (0xffff) si n!=p
           
and ax,p  ; ax => 0 si p est nul, quelque chose si p n'est pas nul
jz Code1 ; valà on si p est nul OU que n==p
 
; Code2
jmp fin
 
Code1:
 
fin:


 
porké j'appelles ça une verion "optimisée", passke y'a qu'un seul saut, les deux comparaisons sont "cumulée".
il faut considérer les branchement comme "très" lents (cassent le flux du pipeline)
 
donc la philosophie:
 
1) on soustrait n à p ou p à n on s'en fous
 
2) si ils sont égaux la soustraction est nulle (0)
 
3) donc si ils sont égaux le cmp ax,1 mettre la ratenue (because 0 < 1)
 
4) par le sbb ax,ax ; on mets AX à 0, puis si y'a retenue (n==p donc), on retire la retenue ce qui donne -1 (0xffff ou 0ffffh)
 
5) on a donc si n==p, ax = 0ffffh, sinon 0
 
6) on fait un AND avec p, ce qui fait que si p est nul, on obtiens 0, si p est non on obtiens quelque chose.
 
7) le AND mettant à jour la flag Zero, on peut brancher en conséquence.

mood
Publicité
Posté le 19-01-2003 à 17:18:47  profilanswer
 

n°289571
bjone
Insert booze to continue
Posté le 19-01-2003 à 20:43:58  profilanswer
 

ça te plait ou pas ?


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

  Comparaisons multiples

 

Sujets relatifs
Détecter les inscriptions multiples[ Prog C ] Probleme avec les includes multiples...
[c++bder] pression touches multiples && capture mouvement sourisRécupérer tous des choix multiples d'une form en HTML dans une servlet
[ASP] Updates multiples!!!Tests multiples browsers résolutions
[JS] Probleme de select à choix multiples[PHP] Formulaire avec des champs multiples
[SQL] Jointures multiples ou SELECT ... IN ?FORM, multiples questions [ simple ]
Plus de sujets relatifs à : Comparaisons multiples


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