Page 1 sur 2
Bug du compteur CX (d'apres mon livre toutefois...)
Publié : dim. 28/mai/2006 17:02
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é ??????
Publié : dim. 28/mai/2006 17:16
par flaith
loop ne fonctionne qu'avec
ECXCode : 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

Publié : dim. 28/mai/2006 17:21
par SPH
flaith a écrit :loop ne fonctionne qu'avec
ECXCode : 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

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
Publié : dim. 28/mai/2006 17:34
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

...........................
Publié : dim. 28/mai/2006 17:39
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

Publié : dim. 28/mai/2006 18:04
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

Non
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)
Publié : dim. 28/mai/2006 18:26
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 !
Publié : dim. 28/mai/2006 18:29
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!!!)
Publié : dim. 28/mai/2006 18:47
par flaith

ah ouais effectivement, va falloir comprendre ce phénomène !!!
Publié : dim. 28/mai/2006 18:55
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 ??
Publié : dim. 28/mai/2006 19:14
par tonton
flaith a écrit :
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

.)
Publié : dim. 28/mai/2006 19:15
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
Publié : dim. 28/mai/2006 19:16
par SPH
tonton a écrit :flaith a écrit :
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 !!!
Publié : dim. 28/mai/2006 19:21
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
Publié : dim. 28/mai/2006 19:34
par flaith
t'as raison, et surtout, dès que l'on touche à l'assembleur, il faut absolument faire beaucoup plus attention
