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 :

Recupérer **Argv dans un registre


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Points : 81
    Points
    81
    Par défaut Recupérer **Argv dans un registre
    Bonjour a tous,

    Voilà, je débute en ASM, j'ai suivi 3 TP avec un prof mais j'ai un problème que voici :

    J'essaye de récupérer dans le main l'adresse de mon **argv, juste après avoir écrit les 2 lignes du enter, et de le mettre dans un registre...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    movl 12(%ebp), %ebx
    movl %ebx, 8(%esp)
    Je sais que mon **argv se trouve à 12(%ebp) mais je sais également que le code ci-dessus est faux lorsque je le mov dans %ebx et que je mov ensuite %ebx dans 8(%esp). Je suis un peu perdu en fait avec le référencement et le déréférencement; on m'a dit que c'était comme les pointeurs en C mais je n'arrive quand même pas à comprendre.

    Je pense que, quand on tape %ebx, on parle de l'adresse de ebx alors que quand on tape (%ebx), on parle de la valeur pointée par l'adresse de ebx dans la pile...

    Bref ça ne résoud pas mon problème ci dessus lol. Si quelqu'un pouvait me venir en aide !!! Merci

  2. #2
    Inactif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Points : 160
    Points
    160
    Par défaut
    mov registre contenu adresse esp+offset

    mov eax D$esp+4* 0~n (par exemple)

    esp est l'adresse de base de ta pile.
    push DWORDtoto -> D$esp+4 = DWORDtoto

    push DWORDtoto1 DWORDtoto2 -> D$esp+4 =DWORDtoto1 D$esp+8 = DWORDtoto2

    Si tu veux travailler avec des variables locales (sur la pile donc) tu utilises des offsets négatifs.

    sub esp 4*nombre de variables DWORD

    en fin de procédure -> add esp 4*nombre de variables DWORD

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Points : 81
    Points
    81
    Par défaut
    Oui je connaissais un peu ce que tu viens de me dire mais ca ne repond pas a mon probleme lol...

    et je suis vraiment bloque :/

  4. #4
    Inactif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Points : 160
    Points
    160
    Par défaut
    essaie d'être un peu plus clair sur ce qui te pose le "vrai" problème.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Points : 81
    Points
    81
    Par défaut
    alors voila j'essaye de refaire la fonction systeme cat sous unix...

    J'ai donc ecrit le bout de code suivant qui marchait d'ailleurs pour un seul argument mais j'ai essaye de changer le code en fonction de argc et la je n'ai plus rien qui marche au niveau de ces lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    pushl %ebp
    movl %esp, %ebp
     
    subl $8, %esp
    movl $0, 4(%esp)
    movl 12(%ebp), %ebx ## QU EST CE QUE JE FAIS REELEMENT ICI ???
    jmp open_lab
     
    open_lab:
    addl $4, (%ebx) ## Probleme
    movl (%ebx), %edx 
    movl %edx, (%esp)
    call open

  6. #6
    Inactif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Points : 160
    Points
    160
    Par défaut
    movl 12(%ebp), %ebx ## QU EST CE QUE JE FAIS REELEMENT ICI ???


    je penche pour mov D$ebp+12 ebx dans une syntaxe bien tordue

    jmp open_lab

    open_lab:

    A moins qu'il manque du code entre les deux, c'est un grand moment de la vie...


    addl $4, (%ebx) ## Probleme

    C'est une opération d'addition (DWORD) donc add Variable le contenu ebx il se pourrait que cela soit quelque peu illégal

    add D$Lpointeur constante, registre, Lpointeur ok

    add D$Lpointeur D$registre D$Lpointeur prout

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Points : 81
    Points
    81
    Par défaut
    ba ce que je veux faire c'est recuperer **argv, lui ajouter 4 pour tomber sur le premier parametre de la ligne de commande en gros argv[1][0], le mettre dans (%esp) puis appeler open...

    c'est pour ca que j'ai ecrit ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #LE ENTER DU MAIN EST JUSTE AVANT
    subl $8, %esp
    movl $0, 4(%esp)
    movl 12(%ebp), %ebx
    open_lab:
    addl $4, (%ebx)
    movl (%ebx), %edx
    movl %edx, (%esp)
    call open
    Voila je crois que j'ai ete super clair, si tu pouvais allumer mon esprit totalement dans le trouble je te serai fortement reconnaissant merki

    Pour la syntaxe c'est notre assistant de td qui nous preconise que l'on code avec la syntaxe intel, donc ca n'est pas une syntaxe plus tordue que les autres ...

  8. #8
    Inactif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Points : 160
    Points
    160
    Par défaut
    Puisque tes DWORD sont dans la pile tu les récupères comme d'hab

    mov registre D$esp+4 DWord 1
    mov registre D$esp+8 DWord 2

    Si ça marche avec un argument, avec deux même manip mais avec l'offset précédent +4

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Points : 81
    Points
    81
    Par défaut
    Bon j'abandonne l'asm pour l'instant j'y comprends rien

  10. #10
    Inactif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Points : 160
    Points
    160
    Par défaut
    Tu peux suivre au debug ce que tu fais, c'est le meilleur moyen de t'approprier, avec ta logique, ce qui se passe pas à pas...

    Simplement un rappel (inutile, certes, mais bon...)

    LpVar adresse

    D$LpVar contenu de l'adresse ici (DWord)

    D$LpVar+4 Contenu de l'adresse + 4

    Idem pour la pile

Discussions similaires

  1. Réponses: 5
    Dernier message: 03/10/2005, 18h01
  2. Réponses: 1
    Dernier message: 20/09/2005, 21h15
  3. [MFC]recup pos pointeur curseur dans CEdit
    Par lucky dans le forum MFC
    Réponses: 3
    Dernier message: 08/09/2005, 10h47
  4. Réponses: 4
    Dernier message: 11/06/2004, 16h27
  5. Lire une valeur dans le registre
    Par John.s dans le forum C
    Réponses: 2
    Dernier message: 26/11/2003, 19h55

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