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

Assembleur Discussion :

Récupérer plusieurs arguments en assembleur


Sujet :

Assembleur

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Points : 10
    Points
    10
    Par défaut Récupérer plusieurs arguments en assembleur
    Bonjour !
    Avant tout je tiens à prévenir que j'utilise linux ^^
    J'aimerais créer un programme qui me permettrait de créer un ou plusieurs fichiers avec les droits que je choisi
    (ex : ./monPgm 777 nom1 nom2 nom3).
    Seulement voilà, j'ai un petit problème :
    J'arrive a faire ./MonPgm nom1 nom2 nom3.... avec une boucle, et je mets 000 par défaut dans mon fichier .asm,
    Seulement, ce n'est pas ce que je veux faire ! En gros, je ne sais pas comment faire pour récupérer le premier argument donné (c-a-d les droits ex:777) et le réutiliser à chaque fois que je crée un nouveau fichier (pour que tous mes fichiers aients le droit choisi)! J'ai essayé de déclarer une variable qui prendrait cette valeur, mais ca ne fonctionne pas au moment de l'appel système ( ca fournit valeurs aléatoire...).

    J'aimerais pouvoir poster mon code mais malheureusement c'est un travail pour l'école et je peux pas le poster au risque de me faire copier/coller.

    Merci de bien vouloir m'aider

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Hello,

    Tous les arguments passés en ligne de commande et récupérés ensuite par le programme en langage machine (quel que soit le langage dans lequel le code source a été écrit) sont du même format : une chaîne de caractères. Et ce, même si cette chaîne représente un nombre pour des yeux humains.

    Si tu arrives à créer tes fichiers, ça veut dire que tu parviens déjà à pointer les bonnes chaînes. Il faut donc interpréter la première et la convertir de l'octal vers le binaire pour obtenir un masque correctement formé, que tu vas ensuite conserver dans une variable ou un registre du processeur.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Merci pour cette réponse
    En fait mon argument doit rester en octal ( l'appel système fonctionne en laissant en octal). Ce que je n'arrive pas à faire, c'est à dire au système que mon argument reçu est octal et pas une chaine de caractère
    J'aimerais pouvoir faire (je sais que c'est faux :p ) pour "je mets un octal de valeur [EBP+8] dans ma variable de nom a. Je ne sais pas si c'est possible où si je dois passer par un algorithme de conversion ( mon exercice semble prendre énormément de lignes alors que le prof m'a avoué pouvoir le faire en 5 minutes)

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Oui, mais tu travailles en assembleur. Il n'y a plus de type à ce niveau. Le micro-processeur ne voit que les octets qu'il lit ou écrit à différentes adresses. Éventuellement, il peut en charger plusieurs à la fois s'il est sophistiqué (ce qui est le cas), par 2, par 4 et maintenant par 8 sur les architectures 64 bits.

    [EBP+8] signifie littéralement « la donnée se trouvant huit octets plus loin que l'adresse contenue dans le registre EBP », soit l'argument passé dans la pile, après l'adresse de retour, la valeur de argc et éventuellement celle de EBP si tu l'as empilé.

    L'octal était la base utilisée avant que l'hexadécimal se démocratise. C'est juste une représentation utile parce qu'elle permet de représenter le binaire de façon claire aux yeux humains mais, au final, c'est bien en binaire que ton mode sera codé dans ton registre, à raison d'un bit par flag. C'est d'ailleurs pour cela que tu utilises les OU logiques « | » pour les cumuler quand tu programmes en langage C. Et ceci parce qu'un chiffre octal se représente exactement sur trois bits. Un chiffre hexadécimal se représente sur 4, ce qui est pratique quand on manipule des octets de huit bits.

    Pour obtenir la valeur binaire exacte, il faut :

    1. Partir d'un registre nul ;
    2. Vérifier que le caractère pointé est bien compris entre « 0 » et « 7 » (respectivement, codes ASCII 48 et 55 en décimal), sinon sortir.
    3. Décaler ce registre de trois bits vers la gauche avec SHL ;
    4. Soustraire le code ASCII du « 0 », donc 48, à ce caractère pour en obtenir la valeur littérale en binaire ;
    5. Fusionner cette valeur avec ce qui est déjà dans le registre en utilisant OR ;
    6. Reprendre au point numéro 2.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Merci pour cette réponse que je vais essayer d'appliquer
    J'ai pas trop trop bien compris l'histoire du décalage vers la gauche, je vois que ca fait x8 et vu que c'est ce qu'il faut pour se déplacer d'une unité pour la gauche en octal j'imagine que c'est lié :p Cependant je ne vois pas trop pourquoi on doit le faire à chaque fois, ne faut il pas le faire 2x pour la première valeur, une fois pour la première valeur et 0 fois pour la dernière ? quand je passe des arguments et que je regarde avec dbg le code binaire me semble tellement compliqué ( si par exemple je passe 7, que je regarde en binaire et que je retire 48, ça ne fait pas 7 :/ ) . ça me parait vraiment flou , je vais m'amuser un peu avec mon debugger ^^ en fait je comprends pas trop comment faire pour isoler un caractère de la chaine .
    Merci en tout cas

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Citation Envoyé par yves1993 Voir le message
    Merci pour cette réponse que je vais essayer d'appliquer
    J'ai pas trop trop bien compris l'histoire du décalage vers la gauche, je vois que ca fait x8 et vu que c'est ce qu'il faut pour se déplacer d'une unité pour la gauche en octal j'imagine que c'est lié :p Cependant je ne vois pas trop pourquoi on doit le faire à chaque fois, ne faut il pas le faire 2x pour la première valeur, une fois pour la première valeur et 0 fois pour la dernière ?
    Tu peux le faire si c'est plus clair pour toi, bien sûr, mais ça revient exactement au même. L'avantage est qu'en décalant de trois bits à chaque passe,
    • Tu effectues moins de décalages au final, ce qui est plus efficace ;
    • Tu écris ainsi un algorithme universel qui fonctionne quelque soit le nombre de chiffres.


    C'est le même principe que lorsque tu utilises une calculatrice quatre opérations : le premier chiffre apparaît à droite et chaque chiffre que tu ajoutes pousse les précédents d'une position vers la gauche et s'insère lui-même à la même position (c'est-à-dire complètement à droite).

    quand je passe des arguments et que je regarde avec dbg le code binaire me semble tellement compliqué ( si par exemple je passe 7, que je regarde en binaire et que je retire 48, ça ne fait pas 7 :/ )
    Il faut que tu nous dises précisément comment tu t'y prends pour que l'on puisse t'aider mais il est possible que ton débogueur affiche les informations en hexadécimal. Essaie avec 30 plutôt que 48.

    . ça me parait vraiment flou , je vais m'amuser un peu avec mon debugger ^^ en fait je comprends pas trop comment faire pour isoler un caractère de la chaine .
    Merci en tout cas
    Il suffit de le lire, tout simplement. Tu peux considérer que « 1 octet = 1 caractère » dans ta situation. Les valeurs passées à main sont des pointeurs vers les chaînes de caractères. Et quand on dit « pointeur vers une chaîne de caractères », ça veut dire l'adresse en mémoire du premier caractère de cette chaîne. Tu lis donc la valeur de l'octet à l'adresse indiquée, tu le traites comme décrit ci-dessus, et tu passes au suivant.

Discussions similaires

  1. [SQL] Récupérer plusieurs lignes spécifiques d'une table
    Par Anduriel dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/04/2006, 19h49
  2. [MySQL] récupérer plusieurs tuples depuis un array
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 29/12/2005, 18h17
  3. récupérer les arguments de la ligne de commande
    Par gblanc dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 13/10/2005, 23h08
  4. Réponses: 8
    Dernier message: 30/05/2005, 13h55
  5. [debutant] [main] plusieurs arguments
    Par naive dude dans le forum Langage
    Réponses: 9
    Dernier message: 28/09/2004, 09h20

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