Manipuler des chaines en assembleur [Résolu]

cs_sylvain16 14 Messages postés vendredi 15 juillet 2005Date d'inscription 9 août 2005 Dernière intervention - 24 juil. 2005 à 15:05 - Dernière réponse : cs_sylvain16 14 Messages postés vendredi 15 juillet 2005Date d'inscription 9 août 2005 Dernière intervention
- 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.
Afficher la suite 

5 réponses

Répondre au sujet
cs_patatalo 1466 Messages postés vendredi 2 janvier 2004Date d'inscription 14 février 2014 Dernière intervention - 25 juil. 2005 à 12:33
+3
Utile
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.

@++
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_patatalo
ToutEnMasm 552 Messages postés jeudi 28 novembre 2002Date d'inscription 26 mars 2016 Dernière intervention - 25 juil. 2005 à 15:56
+3
Utile
Salut,
En instructions assembleur movsb(movsd ...) scasb cmpsb
En api ,lstrlen lstrcpy.Pour les plus courantes.
Avec masm szcatstr.
ToutEnMasm
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ToutEnMasm
cs_sylvain16 14 Messages postés vendredi 15 juillet 2005Date d'inscription 9 août 2005 Dernière intervention - 25 juil. 2005 à 18:04
0
Utile
Merci pour les tuyaux, c'est vraiment sympa!

salut a+
Commenter la réponse de cs_sylvain16
cs_Nasman 202 Messages postés mardi 17 mai 2005Date d'inscription 29 septembre 2008 Dernière intervention - 26 juil. 2005 à 08:21
0
Utile
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.
Commenter la réponse de cs_Nasman
cs_sylvain16 14 Messages postés vendredi 15 juillet 2005Date d'inscription 9 août 2005 Dernière intervention - 29 juil. 2005 à 19:07
0
Utile
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.
Commenter la réponse de cs_sylvain16

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.