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 :

conversions ascii nombres


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2024
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2024
    Messages : 38
    Par défaut conversions ascii nombres
    Bien le bonjour !!

    j essaie (avec nasm sous Linux) de coder la conversion d une chaine ascii vers un nombre et inversement :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
     
    chaine_vers_nb:
        ; rbp : adresse chaine
        ; resultat(r15) contiendra le nombre !!
     
     
        mov rsi, rbp
        call est_un_nombre
     
        cmp booleen, 1  ; pas nombre ?
        je fin_nb
     
        mov rsi, rbp
        call calcul_taille
        ; rdx : taille chaine (sans NULL)
     
        xor resultat, resultat
        mov multiple, 1
        xor rbx, rbx
        xor rax, rax
     
        boucle_nb:
     
            cmp rdx, 0     ; fin de la chaine ?
            jle fin_nb
     
            dec rdx
            mov byte bl, [rbp + rdx]    ; char
            sub bl, 48                  ; char - nb
            mov rax, bl            ; rax * multiple
            mul multiple            ; 
            add resultat, rax      ; resultat += chiffre * multiple
     
            mov rax, 10             ; multiple
            mul multiple            ; = multiple * 10
            mov multiple, rax       ;
     
     
            jmp boucle_nb
     
            fin_nb:
            ret
     
     
     
    nb_vers_chaine:
        ; rax : nombre a convertir
        ; iterateur : nb de chiffres
        ; adresse de la chaine a ecrire : [chaine_nb] contiendra le resultat 
        ; rdx : chiffres a integrer dans la chaine
        push rbx
     
        xor iterateur, iterateur ; compteur de chiffres
        xor rdx, rdx    ; chiffres a convertir
        mov rbx, 10     ; diviseur
        boucle_locale:
            div rbx
            add rdx, 48 ; devient un chiffre
            push rdx    ; modulo
            inc iterateur
            cmp rax, 0  ; calcul termine ?
            jne boucle_locale
     
            mov rbp, chaine_nb
            add rbp, iterateur
            mov byte [rel rbp], 0
        suite:
            pop rbx     ; restitue chiffre
     
            ;  ADRESSSE !!!
            mov rbp, chaine_nb
            add rbp, iterateur
     
            mov byte [rel rbp], bl
            dec iterateur
            cmp iterateur, 0
            jge suite
     
            pop rbx
            ret
    utilisant les fonctions :

    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
     
     
    ; cl doit contenir le char
    est_un_chiffre:
        cmp cl, 48
        jl non_chiffre
        cmp cl, 57
        jg non_chiffre
        mov booleen, 0
        ret
     
        non_chiffre:
            mov booleen, 1
            ret
     
     
    est_un_nombre:
        push rbx
        push rcx
     
            ; rsi : adresse chaine a traiter
     
            mov booleen, 0
            xor rcx, rcx
            xor rbx, rbx
            boucle_chiffres:
     
                mov byte cl, [rsi + rbx]
                cmp cl, 0
                je fin_nmb
                inc rbx
                call est_un_chiffre
     
                cmp booleen, 0
                je boucle_chiffres
                ; retournera booleen(0) si nombre
     
     
        fin_nmb:    ; renvoie booleen = 1 si pas nombre
        pop rcx
        pop rbx
        ret
    et :

    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
     
     
    ;  rsi   doit contenir l adresse du texte a afficher
    ;  rdx   taille du texte a afficher
     
    calcul_taille:
        push rcx
        push rbx
     
        xor rcx, rcx
        xor rbx, rbx
        boucle2:
            mov byte cl, [rsi + rbx]
            cmp cl, 0
            je fin2
            inc rbx
            jmp boucle2
        fin2:
            mov rdx, rbx
     
        pop rbx
        pop rcx
        ret
    j obtient une erreur de type : invalid combination of opcode and operands

    une idee ?
    je pense avoir commis une faute syntaxique, mais je ne la trouve pas.
    Merci.

  2. #2
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2024
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2024
    Messages : 38
    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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
     
        boucle_nb:
     
            cmp rdx, 0     ; fin de la chaine ?
            jle fin_nb
     
            dec rdx
            mov byte bl, [rbp + rdx]    ; char
            sub bl, 48                  ; char - nb
            mov rax, rbx            ; rax * multiple      C ETAIT CA !!
            mul multiple            ; 
            add resultat, rax      ; resultat += chiffre * multiple
     
            mov rax, 10             ; multiple
            mul multiple            ; = multiple * 10
            mov multiple, rax       ;
     
     
            jmp boucle_nb
     
            fin_nb:
            ret
    je devais passer rbx a rax et non bl...

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2024
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2024
    Messages : 38
    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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
     
    nb_vers_chaine:
        ; rax : nombre a convertir
        ; iterateur : nb de chiffres
        ; adresse de la chaine a ecrire : [chaine_nb] contiendra le resultat 
        ; rdx : chiffres a integrer dans la chaine
        push rbx
     
        xor iterateur, iterateur ; compteur de chiffres
        xor rdx, rdx    ; chiffres a convertir
        mov rbx, 10     ; diviseur
        boucle_locale:
            div rbx
            add rdx, 48 ; devient un chiffre
            push rdx    ; modulo
            inc iterateur
            cmp rax, 0  ; calcul termine ?
            jne boucle_locale
     
            mov rbp, chaine_nb
            add rbp, iterateur
            mov byte [rel rbp], 0
        suite:
            pop rbx     ; restitue chiffre
     
            ;  ADRESSSE !!!
            mov rbp, chaine_nb
            add rbp, iterateur
     
            mov byte [rel rbp], bl
            dec iterateur
            cmp iterateur, 0
            jge suite
     
            pop rbx
            ret
    Maintenant, a ce niveau :
    erreur de segmentation...

    donc, si j ai bien compris, la memoire est mal geree...
    j utilise mal rbp, a mon avis...

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2024
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2024
    Messages : 38
    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
    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
     
     
    nb_vers_chaine:
        ; rax : nombre a convertir
        ; iterateur : nb de chiffres
        ; adresse de la chaine a ecrire : [chaine_nb] contiendra le resultat 
        ; rdx : chiffres a integrer dans la chaine
     
     
        xor iterateur, iterateur ; compteur de chiffres
        xor rdx, rdx    ; chiffres a convertir
        mov rbx, 10     ; diviseur
        boucle_locale:
            cmp rax, 0  ; calcul termine ?
            je suite
     
            div rbx
            add rdx, 48 ; devient un chiffre
            push rdx    ; si 1 chiffre          si 2 chiffres
            inc iterateur ; ... iterateur a 1   it = 2
     
     
            jmp boucle_locale
     
        suite:
            mov rcx, iterateur  ; rcx : nb de chiffres
            pop rbx     ; restitue chiffre    le plus haut vers l unite
     
            ;  ADRESSSE !!!
            mov rbp, chaine_nb
            add rbp, rcx
            sub rbp, iterateur
            mov byte [rbp], bl
            dec iterateur ; iterateur--
            cmp iterateur, 0
            jg suite
            ; fin de chaine
            mov byte [rbp + rcx], 0 
     
     
            ret
    c'est un peu mieux...
    tant qu il n y a qu un seul chiffre......

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2024
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2024
    Messages : 38
    Par défaut
    Ca fonctionne :

    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
     
     
    nb_vers_chaine:
        ; rax : nombre a convertir
        ; iterateur : nb de chiffres
        ; adresse de la chaine a ecrire : [chaine_nb] contiendra le resultat 
        ; rdx : chiffres a integrer dans la chaine
     
     
        xor iterateur, iterateur ; compteur de chiffres
     
     
        boucle_locale:
            mov rbx, 10     ; diviseur
            xor rdx, rdx    ; chiffres a convertir
            div rbx
            add rdx, 48 ; devient un chiffre
            push rdx    ; si 1 chiffre          si 2 chiffres
            inc iterateur ; ... iterateur a 1   it = 2
            cmp rax, 0  ; calcul termine ?
            je suite
     
            jmp boucle_locale
        suite:    
            mov rcx, iterateur  ; rcx : nb de chiffres
        bcl:
     
            pop rbx     ; restitue chiffre    le plus haut
     
            ;  ADRESSSE !!!
            mov rbp, chaine_nb
            add rbp, rcx
            sub rbp, iterateur
            mov byte [rbp], bl
            dec iterateur ; iterateur--
            cmp iterateur, 0
            jg bcl
            ; fin de chaine
            mov rbp, chaine_nb
            add rbp, rcx
     
            mov byte [rbp], 0x0
     
     
            ret
    ...

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 529
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 529
    Par défaut
    Merci pour ces retours. Nous étions partis pour te mettre sur la voie mais tu as résolu tes problèmes avant que l'on ait eu le temps de finaliser nos interventions.

    As-tu pensé cela dit, entre autres choses, à indiquer au compilateur que tu travailles en 64 bits, soit avec « BITS 64 » en tête de fichier, soit avec les options appropriées sur la ligne de commande ?

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2024
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2024
    Messages : 38
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Merci pour ces retours. Nous étions partis pour te mettre sur la voie mais tu as résolu tes problèmes avant que l'on ait eu le temps de finaliser nos interventions.

    As-tu pensé cela dit, entre autres choses, à indiquer au compilateur que tu travailles en 64 bits, soit avec « BITS 64 » en tête de fichier, soit avec les options appropriées sur la ligne de commande ?
    oui
    j'ai pensé a "bits64"

    Mon code a encore beaucoup evolué... d erreur en erreur...
    je voudrais prendre le temps de realiser ce petit projet.

    je vous tiens au courant si j arrive a quelque chose...
    Merci d etre la

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2024
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2024
    Messages : 38
    Par défaut
    Bonjour...
    a l heure actuelle, je bloque a ce niveau :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
     
    nb_vers_chaine:
        ; rax : nombre a convertir
        ; iterateur : nb de chiffres
        ; adresse de la chaine a ecrire : [chaine_nb] contiendra le resultat 
        ; rdx : chiffres a integrer dans la chaine (modulo)
        ; rbx : diviseur
     
        push r13
        push r10
        push rbx
        push rdx
        push rbp
     
        ; CHAINE_NB  EST  VIDE  ??
            xor iterateur, iterateur
     
            vider_chaine_nb:
                mov rbp, chaine_nb
                add rbp, iterateur
                mov byte [rbp], '0'
                inc iterateur
                cmp iterateur, MAX
                jne vider_chaine_nb
     
        xor iterateur, iterateur ; compteur de chiffres
     
        boucle_locale:
            mov rbx, 10d    ; diviseur
            cmp rax, 0  ; calcul termine ?
            jl suite
                xor rdx, rdx
            idiv rbx
            add edx, 48 ; devient un chiffre (modulo)
            push rdx    ; si 1 chiffre          si 2 chiffres
            inc iterateur ; ... iterateur a 1   it = 2
     
            jmp boucle_locale
        suite:    
            mov r13, iterateur  ; r13 : nb de chiffres
        bcl:
     
            pop rdx     ; restitue chiffre    le plus haut
     
            ;  ADRESSSE !!!
     
            mov rbp, chaine_nb
            add rbp, r13
            sub rbp, iterateur
     
            mov byte [rbp], dl
            dec iterateur
     
            cmp iterateur, 0
            jg bcl
     
            ; fin de chaine
            mov rbp, chaine_nb
            add rbp, r13
     
            mov byte [rbp], 0
     
            pop rbp
            pop rdx
            pop rbx
            pop r10
            pop r13
     
            ret
    au moyen des commentaires, j ai identifié que le probleme est dans cette fonction.
    c'est entre des erreurs en point flottant (peut etre a cause de la division), et des "core dumped" surement a cause d acces memoire ne convenant pas...
    les erreurs se manifestent a l execution.
    l assemblage et l edition de lien ne posent aucun probleme....

    si quelqu un a une idee.......

Discussions similaires

  1. Fonction de conversion de nombre en lettres
    Par david_chardonnet dans le forum Langage
    Réponses: 21
    Dernier message: 08/12/2021, 18h51
  2. CONVERSION ASCII => HEXA
    Par tatarifa dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 05/11/2005, 16h12
  3. Conversion ascii - entier
    Par Jbx 2.0b dans le forum Général Python
    Réponses: 3
    Dernier message: 15/03/2005, 20h23
  4. [debutant] Conversion ASCII
    Par septox dans le forum Débuter
    Réponses: 1
    Dernier message: 28/02/2005, 10h45
  5. conversion : (Ascii en hexa) => nombre
    Par tut dans le forum C++
    Réponses: 3
    Dernier message: 21/04/2004, 15h44

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