Rechercher dans une chaîne de caractères.
Merci d'avance
Rechercher dans une chaîne de caractères.
Merci d'avance
Gae,
Et 100 € + 1 mars en plus, ça t'intéresse ?
Si les cons volaient, il ferait nuit à midi.
Bonjour,
C'est un peu cours comme message pour que l'on puisse t'aider... Avec un message clair tu aurais sûrement déjà pu avoir une réponse précise...Rechercher dans une chaine de caractere
"Rechercher" quoi dans une chaîne de caractère ? Un seul caractère, une sous-chaîne, le zero terminal, un CRLF, etc. ?
Quel assembleur (x86, ARM, ...) ? quel programme d'assemblage (MASM, Gas) ? quelle syntaxe ?
« Un peuple qui est prêt à sacrifier un peu de liberté contre un peu de sécurité, ne mérite ni l'une, ni l'autre, et finira par perdre les deux. »
Attribué indistinctement à :
Thomas Jefferson
Benjamin Franklin
Albert Einstein !
Au moins il annonce clairement la couleur
Tu as l'instruction CMPS qui permet de comparer le contenu de DS:SI et ESI
Elle peut-etre precedee de "repnz" par exemple avec la longueur a comparer
dans CX.
Enfin, cherches un peu, tu vas trouver
a+ Francois (qui aide un peu mais pas trop )
La solution de facilité avec MASM32
Après, pour le faire (implémenter) soi-même, c'est une autre paire de manche. Il suffit de debugger le code de strstr dans le CRT pour s'apercevoir que c'est loin d'être trivial comme exercice (si on veut faire du code vraiment sûr...).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 .686 .xmm .model flat, stdcall ;32 bit memory model option casemap :none ;case sensitive ASSUME FS:NOTHING include windows.inc include kernel32.inc include user32.inc include msvcrt.inc includelib kernel32.lib includelib user32.lib includelib msvcrt.lib .data big BYTE "une simple phrase de test",0 small BYTE "simple phrase",0 .code start: invoke crt_strstr, addr big, addr small ; ici EAX pointe sur "simple phrase" dans big. ret end start
Il faudrait d'abord écrire l'algo avant de se jeter sur une implémentation, mais là j'avoue que je suis pas vraiment chaud...
Hum... court
edit : Je suis du même avis que Forthman. De prime abord , j'aurais tendance à chercher la première lettre commune et à faire du CMPSB à répétition, quitte à revenir en arrière... Faut voir à quoi ça mène.
beuh,
c'est vrai, c'est de la triche, utiliser les api et les librairies n'a rien d'ASMique
voilà, un beau code ecrit sans le moindre bout de papier, du pur asm en direct live:
bon, je l'ai pas testé, mais avec quelques mises au point, ça devrait fonctionner.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 farfouiller: ;esi=mot a trouver ,0 ;edi=texte a fouiller ,0 ;retourne: ;ebx=pointeur dans le texte ;eax=/=0 alors mot introuvable xor ecx,ecx ; ecx=0 .init: xor edx,edx mov al,[esi+edx] or al,al je .end ; il n'y a rien a faire .findfirst: mov ah,[edi+ecx] or ah,ah je .end ;il n'y a vraiment rien a faire inc ecx cmp al,ah jne .findfirst lea ebx,[edi+ecx-1] ;sauver le pointeur dans le texte inc edx .next: mov al,[esi+edx] inc edx or al,al je .yesss ;c'est la fin du mot? alors c'est bon mov ah,[edi+ecx] inc ecx or ah,ah je .end ;c'est la fin du texte? alors c'est pas bon cmp al,ah jne .init ;c'est pas pareil? alors on recommence jmp .next .yesss: xor eax,eax ret .end: or eax,1 ret
ceci est une fonction qui peut-etre utilisée de partout, dans tout les contextes. meme en mode protégé.
voilà, la version testée, ça fonctionne reelement, je vien de la tester.
et a signaler, je n'ai pas utilisé la moindre feuille de papier, ni meme un seul shemas ou diagramme, tout de tete avec de l'experience et un cerveau gros comme mes chevilles.
j'ai meme pu enlever une étape (findfirst: ) completement inutile.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 mot db 'blabliblou',0 texte db 'blablablabpopolabliblibpipiliblibloubcacaloubloublablibloubloubliblublioublurprrrtffrtpouët',0 ... mov esi,mot mov edi,texte call farfouiller ;ici eax pointe sur 'blabliblou' dans texte jc @f .ok: ... @@: ... ... ... farfouiller: ;esi=mot a trouver ,0 ;edi=texte a fouiller ,0 ;retourne: ;eax=pointeur dans le texte ;cf=1 alors mot introuvable xor ecx,ecx ; ecx=0 .init: xor edx,edx @@: mov al,[esi+edx] inc edx or al,al je @f ;c'est la fin du mot? alors c'est bon mov ah,[edi+ecx] inc ecx or ah,ah je .end ;c'est la fin du texte? alors c'est pas bon cmp al,ah je @b ;c'est pas pareil? alors on recommence jmp .init @@: sub ecx,edx mov eax,ecx clc ret .end: stc ret code UFO-NOSS edfed
c'est ecologique, bon, j'ai gaspillé de l'energie electrique ( nucleaire ) pour le faire, mais au moins, je n'ai pas utilisé de papier, un beau geste pour notre chère planète.
en gros, tu vas avoir une bonne note a ton exam, ça serai cool que tu dise que c'est pas toi qui en est l'auteur, si tu veu des explications, aucun probleme, mais je crois que le code parle de lui meme..
Salut Edfed,
Pourquoi n'as-tu pas utilise CMPS ?
a+ Francois
pour des raisons de souplesse
cmps n'est pas capable de comparer trois fois, et que dire de l'addressage limité
si le processeur est un 386+, ça marche (quel que soit le mode), sinon, il faut adapter au 16 bits, ce qui n'est pas tres dur:
car le 16 bit ne supporte pas grand chose.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 ;mov al,[esi+ecx] mov al,[si+bx] ;mov ah,[edi+edx] mov ah,[di+bx]
excuse, il y a erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 mov al,[si+bp] mov ah,[di+bx]
Les instructions de chaîne sont trop lentes sur les processeurs modernes à part REP MOVS et REP STOS pour les grosses copies mémoire. Personnellement j'ai toujours fait moins d'erreurs avec les instructions élémentaires, mais c'est peut-être parce que je ne les ai pas vues aux cours et que j'ai dû apprendre à faire sans.
:wq
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager