IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

Fonction my_strlen [Débutant(e)]


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 54
    Points : 32
    Points
    32
    Par défaut Fonction my_strlen
    Bonjour,

    Je commence l"assembleur avec nasm (sous X64) , lorsque je compile comme ceci
    nasm -f elf64 my_strlen.s -o my_strlen.o j'obtient l'erreur suivante :
    my_strlen.s:9: warning: label alone on a line without a colon might be in error

    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
     
    [GLOBAL my_strlen]
     
     
    my_strlen:
            mov     ebx, [esp + 4]
            mov     eax, 0
            .avant
     
            cmp     byte [ebx + eax], 0
            je      .fin
            inc     eax
     
            jmp     .avant
     
            .fin
            ret
    Voyez-vous a quoi ca peut correspondre ? je suis deja perdu,
    Dans l'attente de votre reponse.
    Cordialement.

  2. #2
    Membre actif Avatar de golden boy
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 120
    Points : 230
    Points
    230
    Par défaut
    NASM te donne la réponse

    label alone on a line without a colon might be in error
    ça signifie (en gros) un lable seul sur une ligne sans deux-points (':') pourrait être une erreur.

    Donc mets un deux-points à ton .avant et aussi à ton .fin, et regardons ce qu'il en est

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 54
    Points : 32
    Points
    32
    Par défaut
    Merci de ta reponse.

    J'ai remplacer les . par : je n'est plus de warnings mais segfault.
    Je ne comprends pas pourquoi ces modifications ?

  4. #4
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    etiquette:
    .etiquette_locale:
        jmp etiquette
        jmp etiquette2.etaq
        jmp .etiquette_locale
     
    etiquette2:
         jmp etiquette.etiquette_locale
    .etiq:
    .etaq:
         jmp etiquette2
         jmp .etiq

  5. #5
    Membre actif

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 193
    Points : 277
    Points
    277
    Par défaut
    içi la réponse masm optimiser:
    masm32\m32lib\szlen.asm
    ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

    .486
    .model flat, stdcall ; 32 bit memory model
    option casemap none ; case sensitive + car deux points avant none

    .code

    ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    ;ajouter le caractere deux points entre prologue et none
    OPTION PROLOGUE NONE
    OPTION EPILOGUE NONE

    align 4

    szLen proc src DWORD ;+car deux points

    mov eax, [esp+4]
    sub eax, 4

    @@:
    add eax, 4
    cmp BYTE PTR [eax], 0
    je lb1
    cmp BYTE PTR [eax+1], 0
    je lb2
    cmp BYTE PTR [eax+2], 0
    je lb3
    cmp BYTE PTR [eax+3], 0
    jne @B

    sub eax, [esp+4]
    add eax, 3
    ret 4
    lb3:
    sub eax, [esp+4]
    add eax, 2
    ret 4
    lb2:
    sub eax, [esp+4]
    add eax, 1
    ret 4
    lb1:
    sub eax, [esp+4]
    ret 4

    szLen endp

    OPTION PROLOGUE PrologueDef
    OPTION EPILOGUE EpilogueDef

    ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

    end

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 54
    Points : 32
    Points
    32
    Par défaut
    Merci de ta reponse.

    J'ai reussi a faire le strlen mais une question me trotte,
    Le meme code segfault sur une architecture X86_64 alors que sur une i686 le code compile et s'execute correctement ,

    Qu'en pensez-vous ?

  7. #7
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    toutenmasm:
    t'es sur?

    regarde:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    asciizlen:
    ;input edi=string pointer
    ;return ecx=sting len
         cld ;on sait jamais...
         xor ecx,ecx ;limiter la recherche sur 4 giga octets (lol)
         mov al,cl ;on cherche la valeur 0
         repne scasb ;et on lance la recherche
         neg ecx ;inverser le decompteur pour obtenir le compteur.
         ret
    et si on veux vraiment le faire avec un proc, il suffit de charger [esp+4] dans edi, au debut, et copier ecx dans eax avant de quitter.

    l'ideal, ça serait de comparer ces deux fonctions pour voir. mais je pense que la mienne est plus rapide dans 99,99999% des cas. l'optimisation est cassée par l'utilisation de 4 branchements conditonnels, le mecanisme de prediction des branchements ne doit pas du tout aimer.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Fonction API
    Par margilb dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/07/2002, 11h11
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo