Masm

Signaler
Messages postés
3
Date d'inscription
mercredi 11 mai 2011
Statut
Membre
Dernière intervention
16 novembre 2012
-
Messages postés
3
Date d'inscription
mercredi 11 mai 2011
Statut
Membre
Dernière intervention
16 novembre 2012
-
salut pour tous
j'ai un problème dans la partie programmation avec masm
Il s'agit de trouver une chaîne de caractères dans une autre, par exemple, trouver un mot ou une phrase dans un texte.
Soit source la chaîne à trouver et destination le texte à parcourir. On doit se fixer une longueur maximum ou arrêter si on trouve le caractère de fin de chaîne.
en utilisant les commandes "scasb" et la commande "cmpsb",
je fait un programme avec soit scasb seulement
soit cmpsb seulement
mais j'ai pas trouvé une solution avec les 2
*****ma 1ere essai:*****
.586
.model flat,stdcall
option casemap:none
include WINDOWS.INC
include user32.inc
include masm32.inc
include kernel32.inc
includelib USER32.LIB
includelib KERNEL32.LIB
includelib masm32.lib
.data
chaine1 db "une chaine pour le test",0
chaine2 db "c",0
MSG0 BYTE "recherche d'une chaine",0
MSG1 BYTE "la chaine exist",0
MSG2 BYTE "la n'exist pas",0
.code
start:
mov al,chaine2[0]
mov edi,offset chaine1; adresse de la chaine
mov ecx,sizeof chaine1;taille de la chaine + 1
cld; commencer le tesst dés le debut
repne scasb ;l'element exist "test d'un seul caractere"
;repe scab: si l'element n'exist pas
.if (ecx!=0);si ecx different de 0
invoke MessageBox,NULL,addr MSG1,addr MSG0,MB_OK
.else
invoke MessageBox,NULL,addr MSG2,addr MSG0,MB_OK
.endif
invoke ExitProcess,0
end start

*****ma 2eme essai:******
.586
.model flat,stdcall
option casemap:none
include WINDOWS.INC
include user32.inc
include masm32.inc
include kernel32.inc
includelib USER32.LIB
includelib KERNEL32.LIB
includelib masm32.lib
.data
chaine1 db "une chaine pour le test",0
chaine2 db "une",0
MSG0 BYTE "recherche d'égalité entre les 2 chaines",0
MSG1 BYTE "la chaine exist",0
MSG2 BYTE "la chaine n'exist pas",0
.code
start:
mov edi,offset chaine1
mov esi,offset chaine2
mov ecx,sizeof chaine1
cld
repne cmpsb
.if (ecx!=0)
invoke MessageBox,NULL,addr MSG1,addr MSG0,MB_OK
.else
invoke MessageBox,NULL,addr MSG2,addr MSG0,MB_OK
.endif
invoke ExitProcess,0
end start

j'ai besoin de votre aide
et merci
:)

3 réponses

Messages postés
560
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
5 décembre 2020
2
Un coup de pouce


.data
chaine db "chaine",0
.code
lea edi,chaine
mov ecx,sizeof chaine
mov al,"a"
repnz scasb
;voir ou pointe edi dans un debugger et la valeur de ecx

Messages postés
7
Date d'inscription
vendredi 16 décembre 2011
Statut
Membre
Dernière intervention
27 décembre 2012

Salut, ce que vous appelez recherche d'une chaine dans une autre n'est que la recherche d'un seul caractère, il reste de quoi faire !
Bien évidement le registre ES a été initialisé correctement ?! ( scasb met en jeu ES:EDI ), de plus tester ECX afin de reconnaitre si la recherche a réussi est dangereux car le ECX-ieme char peut être celui que l'on recherche, il est préférable de commencer par tester la condition. Quand au deuxieme essai, 'repne' revient immédiatement avec sizeof chaine1 - 1 , cela ne peut fonctionner. Evitez de commencer par le cas particulier ou la chaine recherchée est aussi au debut de celle dans laquelle on cherche. Il faudra imbriquer deux boucles :

mov esi,chaine1
mov ecx,sizeof chaine1

boucle :
push esi
push ecx

...
mov edi,chaine2
mov ecx,sizeof chaine2
REP cmpsb
...
jZ ok

pop ecx
inc esi
loop boucle
Ko :
...
ok :
...
Messages postés
3
Date d'inscription
mercredi 11 mai 2011
Statut
Membre
Dernière intervention
16 novembre 2012

ok merci bcp
je fait mon essai
et si je trouve une problème
je vous questionne de nouveau
puisque je suis débutant dans cette langage
:)

et merci