PureBasic

Forums PureBasic
Nous sommes le Mer 19/Juin/2019 9:59

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 19 messages ]  Aller à la page 1, 2  Suivante
Auteur Message
 Sujet du message: ma toute premiere fois... :p
MessagePosté: Ven 05/Jan/2018 11:32 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 12/Sep/2015 14:31
Messages: 310
Localisation: Alger
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:
;*****************************************************************************************************************************************************************************************
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

_________________
.....i Love Pb :)


Dernière édition par celtic88 le Mer 14/Mar/2018 17:43, édité 4 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: mon tout premier fois... :p
MessagePosté: Ven 05/Jan/2018 11:51 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 4210
Localisation: Arras, France
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 :)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: mon tout premier fois... :p
MessagePosté: Ven 05/Jan/2018 15:46 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 12/Sep/2015 14:31
Messages: 310
Localisation: Alger
:oops:
slt @djes ,
je me souviendrai :p

Merci pour le lien je vais lire, ....

_________________
.....i Love Pb :)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: mon tout premier fois... :p
MessagePosté: Ven 05/Jan/2018 15:59 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 4210
Localisation: Arras, France
Alors là, bravo :)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: mon tout premier fois... :p
MessagePosté: Ven 05/Jan/2018 23:20 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3413
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...

_________________
Juste la 4G pour Smartphone


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: mon tout premier fois... :p
MessagePosté: Ven 05/Jan/2018 23:54 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 4210
Localisation: Arras, France
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é.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: mon tout premier fois... :p
MessagePosté: Sam 06/Jan/2018 5:14 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3413
Code:
;*********************************************************************************

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

_________________
Juste la 4G pour Smartphone


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: mon tout premier fois... :p
MessagePosté: Sam 06/Jan/2018 21:17 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 12/Sep/2015 14:31
Messages: 310
Localisation: Alger
:roll: J'ai aimé vos discussions, et j'ai voulu partager ce exemple pour améliorer la lisibilité d un code asm !

Code:
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())

_________________
.....i Love Pb :)


Dernière édition par celtic88 le Mar 09/Jan/2018 8:18, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: mon tout premier fois... :p
MessagePosté: Sam 06/Jan/2018 22:21 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 4210
Localisation: Arras, France
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: mon tout premier fois... :p
MessagePosté: Dim 07/Jan/2018 22:19 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3413
@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:
;*******************************************************************************************


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:
! 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?

_________________
Juste la 4G pour Smartphone


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: ma toute premiere fois... :p
MessagePosté: Lun 08/Jan/2018 7:07 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3413
Code:
;**************************************************************
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:
;**************************************************************
MOV ecx, VariableSize$

!ClearMemory:

MOV [ebx + ecx - 1], byte 0
LOOP ClearMemory

_________________
Juste la 4G pour Smartphone


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: ma toute premiere fois... :p
MessagePosté: Lun 08/Jan/2018 10:33 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 4210
Localisation: Arras, France
Moi ce qui m'inquiète plus, c'est ça :
Code:
!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...


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: ma toute premiere fois... :p
MessagePosté: Lun 08/Jan/2018 12:51 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3413
Euh...

Mon exemple est plus inquiétant...
Code:
! 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!

_________________
Juste la 4G pour Smartphone


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: ma toute premiere fois... :p
MessagePosté: Lun 08/Jan/2018 17:34 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 14/Oct/2004 19:48
Messages: 1122
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 : 5.45LTS - 32 bits


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: ma toute premiere fois... :p
MessagePosté: Lun 08/Jan/2018 19:23 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 12/Sep/2015 14:31
Messages: 310
Localisation: Alger
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/viewtopic.php?f=13&t=69901

remerci a+

_________________
.....i Love Pb :)


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 19 messages ]  Aller à la page 1, 2  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye