ma toute premiere fois... :p

Pour discuter de l'assembleur
Avatar de l’utilisateur
celtic88
Messages : 309
Inscription : sam. 12/sept./2015 14:31
Localisation : Alger

ma toute premiere fois... :p

Message par celtic88 »

hi :)
je suis entrain d'apprendre l'asm :lol:
et voilà mon très basic code qui sert à :
Retourne un pointeur vers la première occurrence d’une chaîne de recherche dans une chaîne.

Code : Tout sélectionner

;*****************************************************************************************************************************************************************************************
EnableASM

CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
  Macro asmarch:E:EndMacro
  Macro pushsize(s):s:EndMacro
CompilerElse
  Macro asmarch:R:EndMacro
  Macro pushsize(s):s * 2:EndMacro
CompilerEndIf

Procedure StringInStr(Str1,Str2)
  PUSH asmarch#dx                 ;Caractère unicode à comparer
  PUSH asmarch#SI                 ;le compteur
  
  MOV asmarch#ax,[p.v_Str1 + pushsize(8)]       ;adresse vers Str1
  MOV asmarch#cx,[p.v_Str2 + pushsize(8)]       ;adresse vers Str2
  
  !.__loop:                  ;entrer dans la boucle
  
  CMP word [asmarch#ax],0         ;vérifier si c est la fin de texte "Str1"
  JZ ._endloop              ;quitter la boucle
  
  MOV dx, word [asmarch#cx]       ;copier le caractère actuel "word"
  TEST dx,dx                 ;vérifier si c est la fin de texte "Str2"
  JZ ._endloop              ;quitter la boucle
  
  CMP word [asmarch#ax],dx        ;comparer les deux caractères
  JZ ._NextWord             ;sont identiques , continuer sur le caractère suivant
                            ;Sinon
  MOV asmarch#cx,[p.v_Str2 + pushsize(8)]       ;Re-pointez sur le début du texte"Str2"
  XOR asmarch#SI,asmarch#SI              ;réinitialiser le compteur
  
  MOV dx, word [asmarch#cx]       ;Re-comparer les deux caractères
  CMP word [asmarch#ax],dx
  JZ ._NextWord
  JMP ._SkiPNextWord
  
  !._NextWord:
  ADD asmarch#SI,2               ;ajouter "2 = Sizeof(Word)" a compteur
  ADD asmarch#cx,2               ;avancer sur le caractère suivant sur "Str2"
  !._SkiPNextWord:
  ADD asmarch#ax,2               ;avancer sur le caractère suivant sur "Str1"
  
  JMP .__loop              ;rester en boucle
  !._endloop:               ;Fin Boucle
  
  CMP word [asmarch#cx],0        ;fin de texte à chercher,donc tous les caractères sont présents sur str1.
  JNZ ._No                 ;Sinon retourner 0
  SUB asmarch#ax,asmarch#SI             ;Retourner point vers la première occurrence
  JMP ._ret 
  !._No:
  XOR asmarch#ax,asmarch#ax
  !._ret:
  POP asmarch#SI
  POP asmarch#dx
  ProcedureReturn
EndProcedure

;version pb pour comprendre
Procedure PBStringInStr(Str1,Str2)
  Protected edx                 
  Protected esi               
  
  Protected eax = Str1
  Protected ecx = Str2
  
  Repeat
    
    If PeekW(eax) = 0
      Break
    EndIf
    
    edx = PeekW(ecx)
    If edx = 0
      Break
    EndIf
    
    If PeekW(eax) = edx
      eax + 2
      ecx + 2
      esi + 2
    Else
      ecx = Str2
      esi = 0
      
      edx = PeekW(ecx)
      
      If PeekW(eax) = edx
        ecx + 2
        esi + 2
      EndIf
      eax + 2
    EndIf
    
  ForEver
  
  If PeekW(ecx) = 0
    eax - esi
  Else
    eax = 0
  EndIf
  
  esi = 0
  edx = 0
  ProcedureReturn eax
EndProcedure

Debug StringInStr(@"abcd",@"d")
corrigez moi si je trompe ! :D
Dernière modification par celtic88 le mer. 14/mars/2018 17:43, modifié 4 fois.
.....i Love Pb :)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: mon tout premier fois... :p

Message par djes »

Un truc très important en assembleur : COMMENTER ! COMMENTER A OUTRANCE ! COMMENTER CHAQUE LIGNE !
:wink:
Maintenant, t'ayant vu à l'oeuvre, je ne peux que t'encourager ! :)

Rapidement, (moi je suis sur x64, donc je n'ai pas testé) : il y a des instructions spécialement pour la gestion des chaînes de caractères (voit movs, cmps dans la doc de fasm...); il faut utiliser le registre SI (ou ESI), et l'avantage est que les pointeurs sont automatiquement avancés, ça fait gagner du temps...

Tiens voilà des algos à étudier après : http://www.purebasic.fr/english/viewtopic.php?p=467148

Edit : maintenant que tu as bien commenté ton code, je n'ai plus rien à dire :)
Avatar de l’utilisateur
celtic88
Messages : 309
Inscription : sam. 12/sept./2015 14:31
Localisation : Alger

Re: mon tout premier fois... :p

Message par celtic88 »

:oops:
slt @djes ,
je me souviendrai :p

Merci pour le lien je vais lire, ....
.....i Love Pb :)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: mon tout premier fois... :p

Message par djes »

Alors là, bravo :)
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: mon tout premier fois... :p

Message par Ollivier »

Merci, surtout dans un langage beaucoup plus difficile à commenter qu'à coder. Je n'ai pas vérifié si Qwant avait des requêtes pour rechercher les mots de 3 lettres sur le Net.

Je vais spéculer, mais je pense que Djes plaisante. Si tu restes mettre des commentaires ligne par ligne, à droite, quand ton listing s'allonge, il est possible que ta mémoire visuelle se serve des débuts de commentaires en plus des instructions pour retenir le "contexte" (ensemble de lignes d'instructions que ton cerveau va avoir besoin pour "imager" la fonction de ces lignes d'instructions). Et quand tu optimises (chose impossible à planifier, parce qu'un seul détail ajouté ou enlevé est susceptible de changer l'ordre des instructions), tu changes l'ordre.

is ej et arlep cmemo ça, tu vas réussir à me comprendre, mais tu mettras plus de temps à te concentrer sur ce que toute ma phrase veut dire. Et si tu ne mets pas plus de temps, chose possible, alors j'aurais contredit Djes à tort...
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: mon tout premier fois... :p

Message par djes »

Je ne plaisante pas ;)

Quand tu relis un de tes vieux codes asm, si tu n'as pas expliqué la logique, surtout si tu as optimisé, tu vas perdre un temps fou à la retrouver. J'ai des codes de trois lignes faits à une époque où je pratiquais comme un fou, qui sont de vrais casse-têtes.

Et quand tu partages un code avec d'autres, un code asm non commenté exige souvent une lecture ligne par ligne, ce qui peut être long, et franchement, même si j'aime bien coder, je n'aime pas perdre mon temps...

Mais les commentaires sont valables dans tous les langages, surtout en milieu professionnel. Et parfois ils aident à affiner sa propre logique. Pour moi, c'est systématique dès que je fais quelque chose d'un peu compliqué.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: mon tout premier fois... :p

Message par Ollivier »

Code : Tout sélectionner

;*********************************************************************************

! Push Edx 
! Push Esi
! Mov  Eax,         [esp + 12]
! Mov  Ecx,         [esp + 16]

!__loop:

! Cmp  word [eax],   0
! Jz   _EndLoop
! Mov  DX,           word [ecx]
! Cmp  DX,           0
! Jz   _EndLoop

! Cmp  word [eax],   dx
! Jz   _NextWord
! Mov  Ecx,          [esp + 16]

! Xor  Esi,          Esi
! Mov  DX,           Word [ecx]
! Cmp  Word [eax],   DX

! Jz   _NextWord
! Jmp  _SkipNextWord

!_NextWord:
! Add  Esi,          2
! Add  Ecx,          2

!_SkiPNextWord:
! Add  Eax,          2
! Jmp  __loop

!_EndLoop:
! Cmp  Word [ecx],   0
! Jnz  _No

! Sub  Eax,          Esi
! Jmp _Ret

!_No:
! Mov Eax,0          ; (2)

!_ret:
! Pop Esi
! Pop Edx
! ret 8              ; (1)

; 1) pas si nécessaire que ça, cette fois-ci

; 2) Les initiales



; MM ...

; CJ MCJ ... CJM
; XMC JJ ... AAAJ ...
; CJ ... SuJ ... M 



; C'est comme un poème, ça se lit
; une à trois fois très sereinement
; à haute voix et c'est su pour la vie.

; Dommage qu'il y ait des poèmes
; qui comptabilisent encore des dents
; innocentes...
Avatar de l’utilisateur
celtic88
Messages : 309
Inscription : sam. 12/sept./2015 14:31
Localisation : Alger

Re: mon tout premier fois... :p

Message par celtic88 »

:roll: J'ai aimé vos discussions, et j'ai voulu partager ce exemple pour améliorer la lisibilité d un code asm !

Code : Tout sélectionner

Procedure _PokeS(s)
  PokeS(s,"celtic")
EndProcedure

Procedure _PeekS(s)
  Debug PeekS(s)
EndProcedure


Procedure test(Parameter1,Parameter2)
  Macro Var(v)
    [ebx + v]
  EndMacro

  !PushSize$ = 4                                     ;la pile est augmenter après "PUSH ebx"
  
  !LocalString$ = 0                                  ;décalage vers la première variable
  !VariableSize$ = 256                               ;la taille de "LocalString$" en byte #max_path
  !pointLocalString$ = VariableSize$                 ;deuxième variable qui suit la "LocalString$"
  !VariableSize$ = VariableSize$ + 4                 ;la taille de "pointLocalString$" est de type pointeur donc 4byte
  !ReturnFunc$ = VariableSize$                       ;dernière variable "procedurereturn" type 4byte
  !VariableSize$ = VariableSize$ + 4                 ;ajouter 4 byte de "ReturnFunc$"
  
  !Parameter1$ = VariableSize$ + PushSize$ + 4       ;décalage vers le premier paramètre "Parameter1"
  !Parameter2$ = Parameter1$ + 4                     ;décalage vers le deuxième paramètre "Parameter2"
  !ParameterSize$ = 8                                ;4 + 4
  
  EnableASM
  PUSH ebx
  
  SUB esp, VariableSize$                             ;Allouer la mémoire
  MOV ebx, esp                                       ;enregistrer le point actuel de la pile

  MOV ecx, VariableSize$                             ;nettoyer la mémoire
  !ClearMemory:
  MOV [ebx + ecx -1], byte 0                       ;) merci @Ollivier
  LOOP ClearMemory
  
  ;début
  
  LEA ecx, Var(LocalString$)                     ;obtenir l'adresse.....///
  MOV Var(pointLocalString$), ecx  
  MOV Var(ReturnFunc$), dword 123
  
  PUSH dword Var(pointLocalString$)
  CALL dword Var(Parameter1$)
  
  PUSH dword Var(pointLocalString$)
  CALL dword Var(Parameter2$)
  
  
  
  MOV eax, Var(ReturnFunc$)
  
  
  ;Fin
  
  ADD esp, VariableSize$ ;vider la mémoire
  POP ebx
  RET ParameterSize$
  DisableASM
EndProcedure


Debug test(@_PokeS(),@_PeekS())
Dernière modification par celtic88 le mar. 09/janv./2018 8:18, modifié 1 fois.
.....i Love Pb :)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: mon tout premier fois... :p

Message par djes »

Tu t'amuses bien, mais comme ce n'est pas assez commenté et que test() ne veut rien dire, je ne vais pas trop tester ;) :mrgreen:

Après, tu verras que l'assembleur, ce n'est pas que bidouiller dans les arcanes du système, c'est surtout une autre façon de coder et de résoudre les problèmes. Par exemple, pour remplir une zone mémoire. En assembleur, non seulement tu vas directement penser à utiliser des registres les plus grands possibles et à gérer le cache, mais tu peux imaginer le faire avec le contenu d'une autre zone faite de pointeurs ; bref, tu jongles avec ce genre de trucs aisément. Avec un langage évolué, c'est une galère, et l'optimisation n'est pas assurée.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: mon tout premier fois... :p

Message par Ollivier »

@Celtic88

Ce n'est malheureusement pas très lisible. Tu dois rajouter une ligne d'étoile qui doit être plus longue que la plus longue des lignes de ton code source.

Code : Tout sélectionner

;*******************************************************************************************
En tout cas, ça n'empêche pas d'y trouver de la poésie dans ton 1er code.

Et ça n'empêche pas de trouver une astuce dans ton 2nd code :

Code : Tout sélectionner

! Or UneVariable$, 0
C'est la 1ère fois que tu partages en ASM, et c'est gagné, avec ou sans commentaire. Si quelqu'un a des interrogations, si besoin, il s'inscrit, et pose ses questions.

Merci beaucoup Celtic88.

@Djes

Il y a énormément à dire sur la manière de commenter en ASM, peut-être devrait-on créer un sujet en "Hors-sujet" pour synthétiser un ensemble de conseils appréciés d'ici à quelques semaines?
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: ma toute premiere fois... :p

Message par Ollivier »

Code : Tout sélectionner

;**************************************************************
MOV ecx, VariableSize$
MOV [ebx], byte 0 ; mise à zéro de l'offset 0 

!ClearMemory:

MOV [ebx + ecx], byte 0
LOOP ClearMemory
Je me permets de te dire qu'il y a un bug possible à l'avenir.

Ma suggestion :
1) supprimer la mise à zéro de l'offset 0
2) décaler l'adressage en ajoutant "- 1" (ça ne consomme pas plus en temps)

Code : Tout sélectionner

;**************************************************************
MOV ecx, VariableSize$

!ClearMemory:

MOV [ebx + ecx - 1], byte 0
LOOP ClearMemory
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: ma toute premiere fois... :p

Message par djes »

Moi ce qui m'inquiète plus, c'est ça :

Code : Tout sélectionner

!VariableSize$ = 256                               ;la taille de "LocalString$" en byte #max_path
J'ai toujours du mal avec les valeurs absolues. Mais ce n'est qu'un test, j'imagine pour voir comment ça fonctionne avec les strings et la pile...
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: ma toute premiere fois... :p

Message par Ollivier »

Euh...

Mon exemple est plus inquiétant...

Code : Tout sélectionner

! Or UneVariable$, 0
... que son code tout entier qui fonctionne !

J'essaie de fourrer la valeur 0 à la sauce "yeux fermés" dans une méta-variable. Faut être un peu con pour tenter ça !!

:D

En tout cas, avec ça la pile se porte comme un charme.

Don't worry ! Be happy !

Merci encore Celtic88 pour le tuyau!
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: ma toute premiere fois... :p

Message par Fig »

Belle réussite pour une première fois en assembleur !

Nota: si ça tu t’intéresse à la recherche de motifs dans une chaîne de caractères, il y a des algos plus efficaces que celui "naïf" (c'est le terme utilisé dans la littérature spécialisée, non un insulte) que tu utilise.
Par exemple Knuth Morris Pratt ou Boyer Moore, qui ne sont pas si complexe que ça à comprendre, mais tellement plus efficace...
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
celtic88
Messages : 309
Inscription : sam. 12/sept./2015 14:31
Localisation : Alger

Re: ma toute premiere fois... :p

Message par celtic88 »

Wow les trois grand programmeur ici :D
franchement merci beaucoup les mecs pour vos commentaires très encourageants.

l asm il m'a plu je vais investir dedans 8O ,la seule chose qui me déranger c'est le mal de crâne après un code asm :lol: , mai bon j'aime les défis :)

au passage.. j'ai partagé un autre code asm ,j ai appliquer les suggestions de @djes le résultat est bien satisfaisant

http://www.purebasic.fr/english/viewtop ... 13&t=69901

remerci a+
.....i Love Pb :)
Répondre