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 :

problème addition de la ligne de commande


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 11
    Points
    11
    Par défaut problème addition de la ligne de commande
    Bonjour,

    Je poste ici car je ne comprends pas mon erreur, voici un programme qui additionne les deux chiffres que l'on met sur a ligne de commande.

    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
     
    section	.text
        global _start
     
     
    _start:
    	pop ebx ;argc
    	pop ebx	;prog name
    	pop esi ; first arg
    	pop edi ; 2nd arg
     
    	add esi, edi
    	mov ecx, esi
    	call print
     
    	mov eax, 1
    	int 0x80
     
     
    print:
    	mov ebx,1
    	mov edx,3
    	mov eax,4
    	int 0x80
    	ret

    le problème est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    strace ./add 3 4
    execve("./add", ["./add", "3", "4"], [/* 36 vars */]) = 0
    write(1, 0x7fc36ca6, 3)                 = -1 EFAULT (Bad address)
    _exit(1)                                = ?
    que faire ?

    Merci d'avance erol

  2. #2
    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,

    Le problème est que tu donnes un entier à une interruption qui attendait un pointeur vers une chaîne de caractères... Donc le programme va essayer d'aller à l'adresse indiquée par le résultat calculée par le programme...

    Par ce qui me semble bizarre c'est la tronche du pointeur dans l'erreur

    Tu développes sous quel O.S?
    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

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Je suis sous Linux 2.6.35-24-generic-pae Ubuntu i686 GNU/Linux


    j'ai modifié le code, il me semblais plus logique d'utiliser ebx, ecx.

    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
     
    section	.text
        global _start
     
     
    _start:
    	pop ebx ;argc
    	pop ebx	;prog name
    	pop ebx ; first arg
    	pop ecx
     
    	add ecx, ebx
    	call print
     
    	mov eax, 1
    	int 0x80
     
     
    print:
    	mov ebx,1
    	mov edx,3
    	mov eax,4
    	int 0x80
    	ret
    j'ai testé avec tous les registres possible et imaginable


    sous gdb lancé ainsi : $ gdb ./add 2 3 , le désempilage se passe bien, ebx prend 2, ecx 3
    mais lors de l'appel à l'opérande "add", tout flanche

    ecx vire au rouge.

    le reste s'en suit :p

    A + merci pour ta réponse supernail.

  4. #4
    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,

    En fait je crois que tu as oublié le fait que tes arguments étaient des chaînes de caractères...

    Donc pour que ton programme fonctionne, il faut d'abord convertir tes chaînes de caractères en nombres, additionner les nombres obtenus, et transformer le résultat en chaîne de caractères avant de l'imprimer

    (d'ailleurs pourquoi j'ai pas vu ça avant? )
    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

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Re

    Bonjour,

    Je vois bien ce que tu veux dire, disons qu'en asm je pensais pas qu'il fallais en tenir compte.

    comment puis-je faire du coup ?

    je me répond à moi même, puisque j'ai cherché et j'ai regardé une table ascii.

    donc si je comprend bien je soustrait 48 au char.

    après ca j'ai beau lire des choses sur l'adressage, je n'y arrive pas,

    le sub ebx, 48

    par exemple soustrait 48 à l'adresse de ebx, donc je me retrouve au milieu de variables d'environnement....

    je sais que je ne suis pas bien loin et que j'ai loupé un truc important.

    merci d'avance !!

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    RE

    j'ai réussi

    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
     
     
    section	.text
        global _start
     
     
     
    _start:
     
    	pop esi
    	pop esi
    	pop esi
    	pop edi
     
     
    	mov bl, byte [esi]
    	sub ebx, 48
     
     
    	mov cl, byte [edi]
    	sub ecx, 48
     
    	add ecx, ebx
    	add ecx, 48
     
    	push ecx
    	mov ecx, esp
     
    	call print
     
    	mov eax,1
    	int 0x80
     
    print:
    	mov ebx,1
    	mov edx,2
    	mov eax,4
    	int 0x80
    	ret
    par contre n'y a t-il pas moyen d'optimiser un peu plus le code ?

    Je vais passer à l'addition à 2 chiffre désormais =)

    A+

Discussions similaires

  1. Réponses: 11
    Dernier message: 03/04/2012, 16h48
  2. problème Curl/php en ligne de commande
    Par DaYonyon dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 02/06/2010, 18h26
  3. Problème de compilateur en ligne de commande
    Par momo31000 dans le forum EDI
    Réponses: 9
    Dernier message: 05/02/2008, 16h23
  4. Problème d'accent en ligne de commande
    Par fabrice.77 dans le forum Outils
    Réponses: 1
    Dernier message: 13/02/2007, 10h15
  5. 7-Zip - Problème de décompression en ligne de commande
    Par Lorponos dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 26/07/2006, 15h07

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