cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 26 juil. 2005 à 08:21
Une petite précision (ou alors je n'ai rien compris à l'assembleur),
c'est le préfixe repe (opcode F3) qui déclanche la décrémentation du
registre ecx. L'instruction cmpsb qui compare deux octets incrémente
esi et edi si le "direction flag" est à zéro (cld) et décrémente esi et
edi s'il est à 1 (std). De façon analogue cmpsw (cmpsd) compare deux
words (dwords) et incrémente/décrémente de 2 (4) les index.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Répète une instruction de chaine le nombre de fois spécifié dans le registre comteur ou jusqu'à ce que la condition indiquée du flag ZF soit rencontrée. Les mnémoniques REP, REPNE, REPZ et REPNZ sont des préfixes qui peuvent être ajoutés à une des instructions de chaine. Le préfixe REP peut être ajouté aux instruction INS, OUTS, MOVS, LODS et STOS, et les préfixes REPE, REPNE, REPZ et REPNZ peuvent être ajoutés aux instructions CMPS et SCAS (REPZ et REPNZ sont synonymes de respectivement REPE et REPNE). La fonction du préfixe REP est indéfinie quand il n'est pas utilisé avec une instruction de chaine.
Les préfixes REP s'appliquent seulement à une instruction chaine à la fois. Pour répéter un block d'instruction, utilisez l'instruction LOOP ou une autre construction de boucle. Toutes ces préfixes de répétition impose à l'instruction associée à se répéter jusqu'à ce que le registre compteur (ECX) soit décrémenté à 0.
Préfixe Condition(s) de sortie
REP RCX ou (E)CX = 0
REPE/REPZ RCX ou (E)CX 0 | ZF 0
REPNE/REPNZ RCX ou (E)CX 0 | ZF 1
Les préfixes vérifient aussi l'état du flag ZF après chaque itération et termine la boucle si ce flag n'est pas dans l'état spécifié. Quand les 2 conditions testés se terminent, La cause de la fin de la répétition peut être déterminée soit en testant le registre compteur avec une instruction JECXZ ou en testant le flag ZF (avec un JZ, JNZ ou JNE).
Y'a encore une page entière sur ces préfixes, mais cela suffit pour comprendre leurs principes. Et dans la description des instructions de comparaisons:
CMPS/CMPSB/CMPSW/CMPSD/CMPSQ
Il est spécifié que "après la comparaison, les registres (E/R)SI et (E/R)DI sont incrémentés ou décrémentés automatiquement en accord avec le flag DF(Direction Flag), et de n octets en fonction de l'instruction".