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 :

[Linux] StrLen en ASM


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 101
    Points : 56
    Points
    56
    Par défaut [Linux] StrLen en ASM
    Bonsoir, j'aimerais réalisé un strlen en ASM et pouvoir affiché ce résultat à l'écran. Il s'agit donc d'un nombre.

    Voici la fonction strlen en asm :

    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
    strlen:
    	push ebp
    	mov ebp,esp
     
    	xor	ecx, ecx
    	mov	edi, [ebp+8]
    	not	ecx
    	xor eax, eax
    	cld
    	repne	scasb
    	not	ecx
    	lea	eax, [ecx-1]
     
    	mov esp, ebp
    	pop ebp
    	ret
    J'ai essayé de réaliser cette fonction également d'une autre manière, moins efficace, mais plus compréhensible :

    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
    _start:
    mov esi, chaine
    xor ecx, ecx
    strlen:
    mov eax, [esi]
    cmp eax, 0x0
    je success
    inc ecx
    inc esi
    jmp strlen
     
    ....
    .....
     
    .data
    chaine    db    "machin",0x0

    Le problème est ici : cmp eax, 0x0. Je pensais que le dernier caractère de la chaine serait 0x0 or en debuguant eax ne vaut jamais 0 :S. Comment faire pour savoir quand la chaine se termine et sortir de la boucle ?


    Lorsque ce problème est résolu, ecx contient la longueur de la chaine, Comment ferais-je pour afficher "La longueur de %s est %d !\n",chaine,longueur ?

    Merci pour votre aide !!

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 59
    Points : 74
    Points
    74
    Par défaut
    J'ai regardé vite fais, mais je comprends pas pourquoi tu veux prendre eax pour la comparaison. C'est un registre 32 bits, donc il contiendra 4 bytes consecutifs.

    D'ailleurs tu peux voir que les "repne scasb" de strlen, parcours les octets 1 par 1.

    un mov al,[esi] ou un lodsb ne suffirait pas?

    Edit:

    Je viens de faire un tour sur le net, y'a 2 trois exemple interressant:
    http://mdbui2.ift.ulaval.ca/17583_E2...caracteres.htm

  3. #3
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 101
    Points : 56
    Points
    56
    Par défaut
    Tu as parfaitement raison ! Le problème venait du fait que j'utilisais eax qui fait 32bits.

    mov al, [esi]
    cmp al, 0x0

    résout le problème !
    Merci pour ton link je vais regarde ça avec attention, il à l'air très intéressant.

    Merci pour l'aide.

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

Discussions similaires

  1. Réponses: 18
    Dernier message: 27/04/2009, 20h28
  2. Erreur asm/socket.h lors de la compilation du noyau linux
    Par renardho dans le forum Administration système
    Réponses: 3
    Dernier message: 12/09/2008, 12h13
  3. Install 10G Non Rac + ASM sous Linux
    Par davy.g dans le forum Installation
    Réponses: 0
    Dernier message: 16/04/2008, 16h07
  4. utilisation d'un bloc asm sous linux
    Par cmoibal dans le forum C
    Réponses: 5
    Dernier message: 19/02/2008, 15h23
  5. Conversion en asm sous Linux
    Par nelob dans le forum Assembleur
    Réponses: 1
    Dernier message: 30/08/2006, 12h59

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