Bug du compteur CX (d'apres mon livre toutefois...)

Pour discuter de l'assembleur
Avatar de l’utilisateur
SPH
Messages : 4944
Inscription : mer. 09/nov./2005 9:53

Bug du compteur CX (d'apres mon livre toutefois...)

Message par SPH »

Le livre sur l'ASM que j'ai me dit que CX est décrémenté à chaque LOOP.
On peux donc faire un For Next en asm comme ceci :

Code : Tout sélectionner

sph.b=4
!MOV  al,[v_sph]
!MOV  cx,7
! asm:
!ADD  al,1
!loop asm
!MOV  [v_sph],al
Bon, qu'importe le manque d'optimisation, je vous demande juste de regarder la boucle "asm: loop asm". Cette boucle décrémente CX (sans qu'on "SUB CX,1") et s'arrete (d'apres mon livre!!!!) quand CX=0
Pourtant, la boucle est infinie quand j'essaye !!!!!

Mon livre est buggué ??????
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

loop ne fonctionne qu'avec ECX

Code : Tout sélectionner

sph.b=4
!MOV  al,[v_sph]
!MOV  ecx,7
! asm:
!ADD  al,1
!loop asm
!MOV  [v_sph],al 
Debug sph
resultat = 11 :wink:
Avatar de l’utilisateur
SPH
Messages : 4944
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

flaith a écrit :loop ne fonctionne qu'avec ECX

Code : Tout sélectionner

sph.b=4
!MOV  al,[v_sph]
!MOV  ecx,7
! asm:
!ADD  al,1
!loop asm
!MOV  [v_sph],al 
Debug sph
resultat = 11 :wink:
Ha ok (tant mieux d'ailleur, ca nous permet de faire un for next plus grand !!
Etrange quand meme, mon livre est pour proc 8086 jusqu'au P3
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

en mode mode réél(16bits) faut utiliser CX.
en mode protegé (32bits) faut utiliser ECX.
ton livre est un peut vieux, ca va tres vite :) ...........................
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Code : Tout sélectionner

sph.b=4
!MOV  al,[v_sph]
!MOV  cl,7
! asm:
!ADD  al,1
!loop asm
!MOV  [v_sph],al 
ca devrait mieux le faire maintenant :wink:
Avatar de l’utilisateur
SPH
Messages : 4944
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

flaith a écrit :

Code : Tout sélectionner

sph.b=4
!MOV  al,[v_sph]
!MOV  cl,7
! asm:
!ADD  al,1
!loop asm
!MOV  [v_sph],al 
ca devrait mieux le faire maintenant :wink:
Non :wink:
En fait, comme dab, l'ASM est bete et mechant. Si tu indique juste CL, il peut y avoir un residu dans la partie haute de 16 des 32 bits de Ecx et alors, ton CL deviens un nombre beaucoup plus grand que 7 puisque Ecx est considéré dans son entier (d'ou mon attente interminable en me disant : ca ne marche pas; alors que ca marche mais CX est beaucoup plus grand que 7)
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

strange !!! et un p'tit xor ch,ch au tout début ?
parce qu'après +sieurs tests de mon côté j'ai toujours 11 !
Avatar de l’utilisateur
SPH
Messages : 4944
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

Normal !!!
Apres la premiere erreur, ton ECX est corrigé.
Tiens, essaye ca :

Code : Tout sélectionner

sph.b=4 
!MOV ecx,1222555444 ;ne touche pas cette ligne (simulation d'un ecx rempli) 

!MOV  al,[v_sph] 
!MOV  cl,7 ; a toi de corriger l'erreur quelque part ici (2 choix) 
! asm: 
!ADD  al,1 
!loop asm 
!MOV  [v_sph],al 
Debug sph
Execution longue mais ca donne 11 en effet !! pas normal (une etrangeté qui persisme meme en rebootant!!!)
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

8O ah ouais effectivement, va falloir comprendre ce phénomène !!!
Avatar de l’utilisateur
SPH
Messages : 4944
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

tonton a écrit :en mode mode réél(16bits) faut utiliser CX.
en mode protegé (32bits) faut utiliser ECX.
C'est quoi la difference ??
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

flaith a écrit :8O ah ouais effectivement, va falloir comprendre ce phénomène !!!
n' oublier pas que vous metez le resustat dans un octect "al"
le 11 dans "al" est une coinscidence
metez sur eax vous aurez le bon compte

le mode protegé en gros c est le mode encetre du pc qui ne fonctionnaient qu en 16 bit.
maintenant il n est plus vraiment utilisé en travail en mode réel qui est lui en 32 bit(64bit maitenant sur les nouveau processeur donc la il faut utiliser RCX 8) .)
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

je viens de voir, en effet, dès que je teste ca :

Code : Tout sélectionner

sph.l=4
! MOV  ecx,1222555444 ;ne touche pas cette ligne (simulation d'un ecx rempli)
! MOV  eax,[v_sph]
! MOV  cl,7 ; a toi de corriger l'erreur quelque part ici (2 choix)
!asm:
! ADD  eax,1
! loop asm
! MOV  [v_sph],eax
MessageRequester("sph",Str(sph))
ca ne fait plus 11, donc c'est carrement logique
Avatar de l’utilisateur
SPH
Messages : 4944
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

tonton a écrit :
flaith a écrit :8O ah ouais effectivement, va falloir comprendre ce phénomène !!!
n' oublier pas que vous metez le resustat dans un octect "al"
le 11 dans "al" est une coinscidence
metez sur eax vous aurez le bon compte
Figure toi que j'ai pensé EXACTEMENT la meme chose et pourtant, avec d'autre ECX, le resultat reste 11 !!!
DINGUE !!!
Avatar de l’utilisateur
SPH
Messages : 4944
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

flaith a écrit :je viens de voir, en effet, dès que je teste ca :

Code : Tout sélectionner

sph.l=4
! MOV  ecx,1222555444 ;ne touche pas cette ligne (simulation d'un ecx rempli)
! MOV  eax,[v_sph]
! MOV  cl,7 ; a toi de corriger l'erreur quelque part ici (2 choix)
!asm:
! ADD  eax,1
! loop asm
! MOV  [v_sph],eax
MessageRequester("sph",Str(sph))
ca ne fait plus 11, donc c'est carrement logique
En fait, on a 2 choix : Soit Xoré ECX, soit mettre 7 dans ECX !
donc :

Code : Tout sélectionner

sph.b=4 
!MOV  al,[v_sph]
!Xor ecx,ecx
!MOV  cl,7 
! asm: 
!ADD  al,1 
!loop asm 
!MOV  [v_sph],al 
ou (mieux) :

Code : Tout sélectionner

sph.b=4 
!MOV  al,[v_sph] 
!MOV  Ecx,7 
! asm: 
!ADD  al,1 
!loop asm 
!MOV  [v_sph],al 
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

t'as raison, et surtout, dès que l'on touche à l'assembleur, il faut absolument faire beaucoup plus attention :D
Répondre