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 :

[YASM] Récupérer une chaîne de caractères


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [YASM] Récupérer une chaîne de caractères
    Bonjour ,

    Je suis débutant dans le langage assembleur YASM.
    Je dois réaliser un programme demandant à l'utilisateur d’écrire une chaîne en hexadécimal. Vérifiez si elle est en hexadécimal puis afficher le résultat en décimal.
    Problème : je ne sais pas comment récuperer une chaine.
    Voici ce que j'ai faits (pour recuperer la chaine):

    ; fonctions externes pour les entrees/sortie

    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
    extern printf
    extern scanf
    segment .data  ; memoire globale donnees initialisees
    prompt1       db "Entrez une chaine de caractere hexadecimal : ",0 
    sortieSuccess       db "Le nombre en binaire",10,0
    sortieFailure       db "Le nombre en decimal",10,0
    stringFormat  db "%s",10,0
    longIntFormat db "%ld",0
    chaine           db "%ld",9,0
    teste       db "entier :%ld ",0
    newLine       db 10,0
    string        times 0 dq 225
    segment .bss  ; memoire globale donnees non itialisees
     
    segment .text ; code du programme
            global  asm_main
    asm_main:  ; fonction appelee par le programme C
    ; sauvegarde des registres sur la pile
    	push rbp
    ; appel printf 
    	mov rdi,stringFormat
            mov rsi,prompt1
            mov rax,0
    	call printf
    ; appel scanf
            mov rdi,stringFormat
            mov rsi,string
            mov rax,0
    	call scanf
    	mov rbx,[string]
     
    ; appel printf
    	mov rdi,[string]
            mov rax,0
    	call printf   
    e1  :
    ; restauration des registres
    	pop rbp
    ; envoi de 0 au programme C
            mov     rax, 0            
            ret
    Ça m'affiche une erreur de segmentation

  2. #2
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    J'ai modifiez mon code mais scanf ne fonctinne toujours pas

    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
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    ; fonctions externes pour les entrees/sortie
    extern printf
    extern scanf
    segment .data  ; memoire globale donnees initialisees
    prompt1         db "Entrez une chaine de caractere hexadecimal (minuscule): ",0 
    sortieSuccess   db "Le nombre est hexadecimal",10,0
    sortieFailure   db "Le nombre traduits en decimal vaut : %ld",10,0
    a		db "a"
    b		db"b"
    c		db"c"
    d		db"d"
    e		db"e"
    f		db"f"
    stringFormat    db "%s",10,0
    longIntFormat   db "%ld",0
    chaine          db "%ld",9,0
    teste           db "entier :%ld ",0
    newLine         db 10,0
    string          times 0 dq 16
    tab		times 0 dq 16
    segment .bss  ; memoire globale donnees non itialisees
     
    segment .text ; code du programme
            global  asm_main
    asm_main:  ; fonction appelee par le programme C
    ; sauvegarde des registres sur la pile
    	push rbp
    ; appel printf 
            mov rdi,stringFormat
            mov rsi,prompt1
            mov rax,0
    	call printf
    ; appel scanf
            mov rdi,stringFormat
            mov rsi,string
            mov rax,0
    	call scanf
    ; parcours du tableau verification de chaque entrees
    	mov rcx,0
    	mov r8,16
     
    while:
    	mov r10,0
    	cmp rcx,r8
    	je endwhile
    	mov r9,[string+rcx*8]
    	cmp r9,0
    	je next
    	inc r10
    	cmp r9,1
    	je next
    	inc r10
    	cmp r9,2
    	je next
    	inc r10
    	cmp r9,3
    	je next
    	inc r10
    	cmp r9,4
    	je next
    	inc r10
    	cmp r9,5
    	je next
    	inc r10
    	cmp r9,6
    	je next
    	inc r10
    	cmp r9,7
    	je next
    	inc r10
    	cmp r9,8
    	je next
    	inc r10
    	cmp r9,9
    	je next
    	inc r10
    	cmp r9,[a]
    	je next
    	inc r10
    	cmp r9,[b]
    	je next
    	inc r10
    	cmp r9,[c]
    	je next
    	inc r10
    	cmp r9,[d]
    	je next
    	inc r10
    	cmp r9,[e]
    	je next
    	inc r10
    	cmp r9,[f]
    	je next
     
    ; appel printf SI echec
    	mov rdi,stringFormat
            mov rsi,sortieFailure
            mov rax,0
    	call printf
    	jmp e1
    ;on enregistre dans un tableau les valeurs des chiffres hexadecimal
    next:   mov [tab+rcx*8],r10
    	inc rcx
    	jmp while
     
    endwhile:
    	mov rcx,0
    	mov r11,0
    while2:	
    ; on decale et ajoute les different chiffres hexadecimal
    	cmp rcx,r8
    	je endwhile2
    	mov r9,[tab+rcx*8]
    	mov r10,0
    while3:	cmp rcx,r10
    	je next2
    	shl r9,4
    	inc r10
    	jmp while3
    next2:	add r11,r9
    	inc rcx
    	jmp while2
    ;on affiche le resultats
    endwhile2:
    ; appel printf reussite
            mov rdi,sortieSuccess
            mov rsi,r11
    	call printf
    	jmp e1
     
    e1 :
    ; restauration des registres
    	pop rbp
    ; envoi de 0 au programme C
            mov     rax, 0            
            ret

  3. #3
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Bonjour,

    Tout d'abord, il ne faut JAMAIS appeler scanf avec comme chaîne de format "%s", étant donné qu'il n'y a aucun moyen de limiter la taille de l'entrée de l'utilisateur, celle-ci peut faire planter le programme si l'entrée dépasse du tampon alloué (cette remarque est aussi valable en C ). Tu demandes un retour chariot (le 10 à la fin de ton "%s") ce qui fait que scanf va attendre qu'un retour chariot soit effectivement saisi pour sortir .
    Bref dans ce cas précis, tu peux remplacer scanf par fgets qui te permet de limiter la taille de l'entrée (qui présente l'avantage d'être légèrement plus rapide vu qu'il n'y a pas l'interprétation de la chaîne de format).

    Ensuite tu attends une chaîne de caractères de 16 caractères et tu réserves 16 qwords soit 16*8 octets (ça fait beaucoup ), sans parler du fait qu'il n'y aucun moyen de garantir que ce que saisira l'utilisateur sera bien une chaîne représentant un nombre hexadécimal de 16 octets (du coup boucler sur une taille théorique c'est pas très robuste )

    Ensuite, je pense que tu devrais réfléchir à un algorithme meilleur pour convertir une chaîne hexadécimale en décimal (notamment en jouant sur le code ASCII des caractères que tu manipules )
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  4. #4
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 215
    Points : 10 138
    Points
    10 138
    Par défaut
    Pour ma part je trouve cette exercice demandé inutile , je ne vois pas l’intérêt de faire l'assembleur pour appeler des fonction haut niveau faite et pour être utilisé en C...

  5. #5
    Invité
    Invité(e)
    Par défaut
    Quel rapport entre appelé des fonctions et le langage utilisé ?

    C'est vrai qu'on aimerait pourvoir tout recoder, le problème parfois, on fait face à des impossibilités, car les ports I/O (PMIO ) et les zones mappée (MMIO) sont sécurisés et obligé donc d'aller sur des dll.
    De même qu'on ne peut pas faire n'importe quoi, même avec les langages de haut niveaux.

    Donc je vois pas en quoi ça te dérange que l'on appelle des fonctions que l'OS nous offre pour faire de l'IHM (WinAPI).

  6. #6
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 215
    Points : 10 138
    Points
    10 138
    Par défaut
    Cela ne me dérange pas , mais comme je le redis je ne vois pas l’intérêt d'utilisé des fonctions C en assembleur et surtout faire de l'assembleur sur un OS moderne pour juste finalement réutilisé les fonctions haut niveau.
    Savoir faire une affectation , comparaison ect , bon en assembleur on en voit rapidement le tour et l’intérêt est limité de se contenté de cela, après faire un programme full assembleur sur un OS moderne est la aussi assez inutile comparé au pléthore de langage disponible maintenant (et qui sont fait vraiment pour faire des applications dessus) , qu'on me dise pas que l'assembleur c'est jouissif a faire sur Linux par exemple ...
    Par contre si c'était un exercice sur ms-dos , j'y verrais une plus grand utilité en terme d’apprentissage et plus intéressante a mes yeux (on peut tapé directement sur le matériel).

  7. #7
    Invité
    Invité(e)
    Par défaut
    Mais il y a un problème, c'est qu'il y a une différence entre faire un truc qui génère du fric et la passion, désolé de te l'apprendre, mais on est pas tous des moutons qui suivent le cursus normal de l'informatique, s'il y a quelque personne qui veulent découvrir cet univers de l'assembleur, c'est leur/mon problème.

    Tu connais nasm ? Tu crois sérieusement que tu vas mp les dev de ce programme de la non-utilité de leur programme et qu'ils vont t'écouter ?

    http://forum.nasm.us/index.php

    Mais ce qui m'étonne le plus dans tes propos, c'est les avancements que tu fais à propos du langage utilisé pour les fonctions primaires (scanf, printf, ect ect).

    Dis-moi, sauf erreur de ma part, détiens-tu les codes-sources de ces fonctions ? Je te parle de la WinAPI, pas de ta lib livrée avec gcc, hallucinant
    Dernière modification par Invité ; 04/01/2015 à 21h31.

  8. #8
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 215
    Points : 10 138
    Points
    10 138
    Par défaut
    L'assembleur pour ma part ne peut générer du fric , il y a encore une boite qui recrute des programmeurs assembleurs ? (pour ma part c'est non).
    Et donc on part donc dans l'apprentissage de l'assembleur de manière personnelle et je maintiens je que je dis il faut plus voir d'autre machine que le PC moderne pour vraiment apprendre l'assembleur.
    nasm permet de compiler pour n'importe quel cible x86 et je l'ai utilisé que pour principalement du ms-dos et rarement pour du linux.
    N'étant pas sur windows je connais très peu cette plate forme , de même que son API (et je n'ai jamais dit que je la connaissait).
    Donc cela va de soi que ça n'engage que moi mais je pousserai plus un nouveau venu de voir autre chose que de faire de l'assembleur sur un OS moderne , il comprendra je pense beaucoup plus facilement le fonctionnement d'un ordinateur et comment cela tourne derrière.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Entendu, maintenant, il faudrait entendre la voix de l'intéresser, pour voir qui la plus séduit, le pro-asm ou le pro-C.

    Mais avant, je vais une fois de plus argumenter ma position, t'en as 3 et moi 2, c'est partis:

    -Quant je dit, faire de l'argent, je n'ai pas fait un sous entendu à l'assembleur, mais plutot avec les langage de haut niveaux, par contre pour la passions c'est de l'assembleur, eh oui, en général, les pro-asm font ça pour leur passion.

    -Apprendre l'assembleur pour d'autres machine(8-bit) et pas de pc moderne (SIMD, AVX, AVX2) ? Donc si je comprends bien, les gens qui font les compilos pour vos programmes se doivent d'arrêter leur fonction et d'arrêter de proposer le support de nouvelles technologies du CPU ?

    -hmm, ça ressemble plus à de la dictature ton envie plutôt qu'à des conseils, déjà que c'est une lourde décision de vouloir faire de l'assembleur (voyage sans retour, enfin selon moi bien sûr ^^) donc il faut bien savoir si on veut vraiment emprunter ce chemin.
    Mais si tu interpelles toutes les personnes voulant apprendre l'assembleur en leur disant: reculez ! vous faites fausse route.

    Désolé mais c'est une sorte d'insulte à notre liberté, je te dis ça, car moi aussi on m'a essayé de me mettre des bâtons dans les roues pendant que j'apprenais l'assembleur et donc je défends vivement quiconque se trouvant prise en étau par des personnes comme toi, qui dénigre ce langage.

    Et il faut savoir que l'assembleur a eu son age d'or, au début de l'air de l'informatique.
    Dernière modification par Invité ; 05/01/2015 à 00h22.

  10. #10
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 215
    Points : 10 138
    Points
    10 138
    Par défaut
    Je ne suis pas pro-C ni pro-asm , et je code en assembleur quotidiennement chez moi mais dans certain cas (principalement sur des processeurs qui possède que quelque mgz et qql ko) , je suis plus pour une programmation en full assembleur.
    Mais sur des machines possédant des GO de mémoire RAM , plusieurs Ghz, des librairies haut niveau , des langages haut niveau ce genre de machines ne se prêtent plus pour faire de l’assembleur (pas seulement d'un point de vue purement personnelle mais si je les compare a l'époque il est certain que les vieux ordinateur était orienté plus pour que le programmeur puisse faire de l'assembleur que de nos jours) .
    Donc je ne le pousse pas a faire du C ,au contraitre de continuer a faire de l'assembleur mais plus de le faire sur une plateforme qui lui permettra de toucher le matériel et idéalement je le pousserai sur des vielles machines avec des processeurs comme le 6502 ou le 6800 , (je trouve le z80 pas mauvais mais loin d’être mon préférer).

  11. #11
    Invité
    Invité(e)
    Par défaut
    Honnêtement, c'est plus préférable de faire de l'asm sur un CPU de 4eme génération que tes vieilleries, i7-4790T (SSE 4.1/4.2, AVX 2.0) pour ses jeux d'extensions ISA: https://software.intel.com/fr-fr/intel-isa-extensions

    Et déjà qu'apprendre tout le système d'un CPU est dur, mais si en plus tu veux apprendre à coder sur plusieurs CPU, bonjour la migraine, perso je me spécialise dans la programmation vectorielle (AVX) d'intel, tous les autres CPU n'existent pas pour moi (oui je suis assez extrémiste pour le cas)
    Dernière modification par Invité ; 05/01/2015 à 21h12.

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/11/2009, 08h19
  2. sql récupérer une chaîne de caractères dans un champ
    Par ritchie23 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/05/2009, 13h12
  3. comment récupérer une chaîne de caractères
    Par the_crow_man dans le forum C
    Réponses: 8
    Dernier message: 04/07/2008, 16h39
  4. Réponses: 3
    Dernier message: 27/05/2008, 21h05
  5. [OS Perso] Récupérer une chaîne de caractères
    Par log2n dans le forum Programmation d'OS
    Réponses: 31
    Dernier message: 14/02/2006, 14h56

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