Manipuler des chaines en assembleur

Résolu
cs_sylvain16 Messages postés 14 Date d'inscription vendredi 15 juillet 2005 Statut Membre Dernière intervention 9 août 2005 - 24 juil. 2005 à 15:05
cs_sylvain16 Messages postés 14 Date d'inscription vendredi 15 juillet 2005 Statut Membre Dernière intervention 9 août 2005 - 29 juil. 2005 à 19:07
Voilà, je débute en assembleur, j'ai lu pas mal de trucs sur le sujet, mais un truc n'est pas très clair:

comment on lit et écrit des chaines de caractères, et comment on pourrait comparer 2 chaines de caractères?

Si j'ai bien comprit on utilise DS:ESI pour la source et ES:EDI pour la destination.... mais quelles instructions faut-il utiliser?

Si quelqu'un peut m'aider à éclaircir ce sujet çà serait sympa, merci.

5 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 1
25 juil. 2005 à 12:33
salut,

mov [esi],'a'
mov [esi+1],'s'
mov [esi+2],'m'
mov [esi+3],'f'
mov [esi+4],'r'
mov [esi+5],0

mov [edi],'a'
mov [edi+1],'s'
mov [edi+2],'m'
mov [edi+3],'f'
mov [edi+4],'r'
mov [edi+5],0

mov ecx,5
cld
push esi
push edi
repe cmpsb
pop edi
pop esi
je .chaineidem

l'instruction cmpsb incremente esi et edi et decremente ecx.

@++
3
ToutEnMasm Messages postés 591 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
25 juil. 2005 à 15:56
Salut,
En instructions assembleur movsb(movsd ...) scasb cmpsb
En api ,lstrlen lstrcpy.Pour les plus courantes.
Avec masm szcatstr.
ToutEnMasm
3
cs_sylvain16 Messages postés 14 Date d'inscription vendredi 15 juillet 2005 Statut Membre Dernière intervention 9 août 2005
25 juil. 2005 à 18:04
Merci pour les tuyaux, c'est vraiment sympa!

salut a+
0
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_sylvain16 Messages postés 14 Date d'inscription vendredi 15 juillet 2005 Statut Membre Dernière intervention 9 août 2005
29 juil. 2005 à 19:07
Nasman, tu a entièrement raison, mais je précise un peut plus:

J'ai relut la doc Intel et effectivement c'est bien REPE qui décrémente ECX. Pour aller plus loin je traduit ce qui est écrit:

REP/REPE/REPZ/REPNE/REPNZ- Repeat String Operation Prefix

Description

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".

Encore merci les gars.
0
Rejoignez-nous