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 :

taille arguments ligne de commande


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre habitué
    Profil pro
    amateur
    Inscrit en
    Avril 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : amateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 145
    Points : 144
    Points
    144
    Par défaut taille arguments ligne de commande
    Bonjour,

    Je (re)démarre de zéro en assembleur, sous Linux.

    Pour mon premier prog, je souhaite écrire un "salut, [username] !" où usename est donné comme arg au programme. Pour ecrire sur le terminal / stdout, j'utilise juste l'appel à sys_write, mais pour cela je dois indiquer la longueur de la chaîne et j'ai aucune idée de comment l'avoir. (J'magine que ce que l'on trouve sur la pile au démarrage est une liste de pointeurs, mais où sont les tailles des chaînes pointées là ?)

    Merci,
    Denis

    PS: comme en-dessous de tout ça, y a du C, j'imagine aussi que la réponse est pê "y a pas !", au sens où les chaînes seraient "nul-terminated". Dans, ce cas, y a-t-il une façon standard / simple d'obtenir la taille (càd récrire strlen en asm) ? Plus généralement, y a-t-il une façon std de stocker les tailles avec les chaînes et autres tableaux, en asm ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Le prototype de la fonction main est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int main(int argc, const char* argv[])
    argc est passé par valeur et argv est passé par adresse. Donc, la pile (stack frame) de la fonction main est organisée comme suit :

    1. le nombre des arguments : 0(%ebp).
    2. le nom du programme : 4(%ebp).
    3. Les adresses des arguments sont stockés depuis l'adresse 8(%ebp).

    Donc pour calculer la taille de chaque argument vous pouvez utiliser la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    size_t strlen(const char *s);
    Vous devez passer la même adresse dans la pile à la fonction strlen. La valeurde retour de la fonction sera chargée dans le registre EAX du proceseur.

    Si vous voulez utiliser seulement de l'assembleur pour calculer la taille d'un argument vous pouvez utiliser la propriété qu'une chaîne de caractères en langage C est un tableau de caractères qui se termine par le caractère NUL.
    Ainsi, vous avez le début de l'argument 8(%ebp) et la fin un caractère NUL.

    Pour bien comprendre comme invoquer une fonction standard C dans un code assembleur GNU : http://c.developpez.com/telecharger/...mbleur-et-du-C

    Bon chance
    Dernière modification par Invité ; 19/02/2013 à 13h26.

  3. #3
    Membre habitué
    Profil pro
    amateur
    Inscrit en
    Avril 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : amateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 145
    Points : 144
    Points
    144
    Par défaut
    Merci Issam,

    Les arguments ligne de commande sont donc passés sans leur taille, puisque ce sont de pures chaînes C, si je pige bien. Donc, mes 2 prochains petits essais seront de calculer une longueur de chaîne, et de réinventer les Pascal strings, des bouts de texte qui connaissent leur longueur

    Denis

  4. #4
    Invité
    Invité(e)
    Par défaut
    Justement !
    Les deux derniers argument sont des pointeurs (adresses) vers des chaines de caractères situées dans la mémoire de données (data segment).

    Tu peut donc faire appel à la fonction strlen() ou réinventer la roue !

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

Discussions similaires

  1. Taille d'un argument passé en ligne de commande limité !
    Par benthebest dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 06/05/2010, 13h30
  2. [DEBUTANT again]Arguments ligne de commande
    Par panda31 dans le forum Langage
    Réponses: 14
    Dernier message: 31/05/2007, 18h19
  3. taille max des arguments en ligne de commande
    Par clepape dans le forum Langage
    Réponses: 2
    Dernier message: 08/10/2005, 13h18
  4. Réponses: 3
    Dernier message: 07/04/2003, 20h06
  5. Récuperer Arguments sur la ligne de commande ?
    Par Muetdhiver dans le forum x86 16-bits
    Réponses: 9
    Dernier message: 20/01/2003, 21h01

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