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 16-bits Assembleur Discussion :

Récuperer Arguments sur la ligne de commande ?


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut Récuperer Arguments sur la ligne de commande ?
    Bonjour a tous, je desirerai savoir comment récupérer des arguments passé en ligne de commande. Quelles interruptions font ca ? y aurait il de la doc quelque part ??
    ex : monprog arg1 arg2 ....

    Voila, merci et bon noel

  2. #2
    Membre habitué

    Inscrit en
    Avril 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 32
    Points : 150
    Points
    150
    Par défaut
    Y'a pas d'interruption, c'est dans le PSP

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut
    PSP ???
    hum ??

  4. #4
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut
    Benoît explique justement très bien ce que c'est dans son tutorial sur l'assembleur http://benoit-m.developpez.com/assem...s/sommaire.php. C'est vers le début du tuto.

    Par contre, je ne sais pas vraiment comment on peut y accéder avec les fichiers EXE.

  5. #5
    Membre habitué

    Inscrit en
    Avril 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 32
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par Biglo
    Par contre, je ne sais pas vraiment comment on peut y accéder avec les fichiers EXE.
    Dans un fichier EXE (au début du programme), les registres DS et ES pointent vers le PSP donc on y accède avec ES:[offset_de_l_octet_dans_le_PSP]

  6. #6
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut
    Oui, j'y ai pensé quelques heures après avoir posté mon message

    Sinon j'ai lu qu'il y avait toujours moyen de récupérer l'adresse du PSP avec la fonction 62h du DOS.

  7. #7
    Membre habitué

    Inscrit en
    Avril 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 32
    Points : 150
    Points
    150
    Par défaut
    Exact

  8. #8
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut A l'aiiiiide ;((((
    Bonsoir, alors j'ai cherché sur comment recupérer un argument.
    Voici ce a quoi j'arrive :
    J'arrive a recupérer l'argument en restant dans le PSP. voici comment :
    (nb c'est avc un fichier EXE) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        xor ax, ax  ; ax = 0
         mov di, 81h    ; di = Offset de debut de chaine
         mov al, ds:[80h]  ; On lit la longeur de la chaine
         add di, ax  ; di = Offset_Chaine + Longeur
         mov byte ptr [di], '$' ; on place un caracter de fin (pour Fnt 9, int 21h)
     
         mov zzz, 81h    ; Pointe le debut de la chaine
    aisni, ma variable zzz aura l'adresse du debut des arguments.
    si je fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
         xor dx,dx
         mov dl, zzz
         mov ah, 09h
        int 21h
    Ca fonctionne, ca m'affiche bien mes arguments.

    Mais ensuite je dois charger les données, ce que l'on fait a chaque debut de programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mov Ax,@data
    mov Ds,Ax
    Et a partir de ce moment, zzz devient n'importe quoi puisque je ne suis plus dans le PSP.
    J'ai pourtant besoin absolument de savoir les arguments en ayant mis @data dans Ds, puisque dans le coeur de mon programme je me sert des arguments....
    Alors j'ai essayé la fonction DOS :
    entrée = AH = 62h
    sortie = BX = Adresse du segment PSP, en faisant comme ca :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    mov ah, 62h
    int 21h
     
    add bx, 81h
    mov zzz, bl
    Donc la theoriquement BX contient au depart l'adresse du PSP, et j'ajoute 81h (selon le tableau), pour aller au debut de la chaine contenant les arguments. Ensuite je remet Bl dans ma variable zzz, et quand je veux l'afficher ca ne fonctionne pas.
    quelqu'un aurait il une solution s'il vous plait je suis vraiment en galere.
    Merci.
    ++

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    euh charger la valeur du segment de donnees au début du programme c pas systematiquement obligatoire. Bon effectivement c'est très frequent. Mais si tu peux traiter lla ligne de commande avant de changer la valeur de ds, fais le. Sinon on té dit egalement que es, contenait le segment du PSP. Donc fait le avec ES et non pas a vec DS. Et enfin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int 21h 
     
    add bx, 81h 
    mov zzz, bl
    ca c'est un peu n'importe quoi. bx contient le segment pas l'offset. Si tu fais un truc du style

    [code]
    mov ax, [zzz+4]
    [code]

    ce sera exactement la même chose que

    [code:6c0c95aac1]
    mov ax, ds:[zzz+4]
    [/code:6c0c95aac1]

    tu peux pas additioner l'offset (81h) au segment (bx)

    Donc utilises un registre segment :

    [code:6c0c95aac1]
    mov ah, 62h
    int 21h

    mov ax, bx
    mov es, ax
    [/code:6c0c95aac1]

    puis plus loin pour reproduire ce que tu as fait precedement :

    [code:6c0c95aac1]
    xor ax, ax
    mov al, es:[80h]
    mov di, al
    mov byte ptr es:[di+81h], '$'
    [/code:6c0c95aac1]

    Puis si l'interruption pour afficher les caractères demande ds comme segment, il faut sauvegarder ds, et mettre es dedans.

    Quoiqu'il en soit, il me semble que les fonctions du BIOS sont bien mieux adaptés pour afficher les arguments.

  10. #10
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut
    bonsoir, comme je suppose que d'autres personnes chercheront comment faire, et qu'a la suite de ces différents postes j'étais encore dubitatif sur la maniere de proceder, je poste ici ma fonction qui tout simplement regarde si on a entré un argument t ou g, et passe mon programme en mode texte ou en mode graphique.
    Attentio, on ne peut utiliser cette fonction qu'avant la premier utilisation du registre es. exemple :
    mov ax, adresse_memoire_video
    mov adresse_memoire_video, ax
    call argument

    ca ne fonctionnera pas. Il faut appeler Argument avant.
    Bon voila, amusez vous bien. ++
    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
     
    Argument Proc
     
    push ax
    push bx
    push cx
     
    xor ax,ax
    xor bx,bx
    xor cx,cx
    mov cl, byte ptr es:[80h] ; Cf tableau --> 80h -> longueur de la chaine d'argument.
     
    cmp cl, 0 ; pas d'argument
    je aucun_argument
     
    mov al, byte ptr es:[82h] ;access aux differents elements de la chaine d'arguments. CF tableau. 82h --> deuxieme éléments de la chaine, apres l'espace
     
    ;-- Test sur g
    cmp al, 'g'
    jne al_pas_g
    mov Graphik, '1' ; Mode Graphique
    jmp fin_argument  ; Ca ne permet de ne pas executer ce qui vient a chaque fois
    al_pas_g :
    ; --- test sur t
    cmp al, 't'
    jne al_pas_t
    mov Graphik,'0' ; Mode texte
    jmp fin_argument
    al_pas_t : 
    jmp aucun_argument
     
    aucun_argument :
    xor dx,dx
    lea dx, pas_d_argument
    mov ah, 9
    int 21h
    ; Constraint Error : on quitte le programme !!
    mov ah,4ch		
    int 21h	
     
    fin_argument :
    pop cx
    pop bx
    pop ax
    ret
    Argument EndP

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

Discussions similaires

  1. Saisie d'arguments dans la ligne de commande
    Par sangei dans le forum Général Java
    Réponses: 20
    Dernier message: 06/12/2009, 16h08
  2. récupération d'arguments de la ligne de commande
    Par Jérémy Lefevre dans le forum C
    Réponses: 2
    Dernier message: 07/11/2006, 10h53
  3. [CF1][VB.NET] Récupèrer arguments de la ligne de commande
    Par azerty25 dans le forum Windows Mobile
    Réponses: 5
    Dernier message: 01/11/2006, 20h47
  4. Réponses: 5
    Dernier message: 11/07/2006, 17h32
  5. 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

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