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 :

[Débutant] Récupérer les paramètres d'une routine


Sujet :

Assembleur

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 8
    Points : 4
    Points
    4
    Par défaut [Débutant] Récupérer les paramètres d'une routine
    Bonjour à tous(toutes)...

    Etant nouveau, sur ce forum, et en langage assembleur, je vous salue tout d'abord, ce qui me paraît le minimum... mais que l'on oublie parfois...

    J'explique mon problème:
    - Soit un suite d'instruction en langage machine (récupérée sur internet, et écrite, à la base, en assembleur). Lorsque j'utilise cette routine (au travers un autre langage type QB), je lui passe des paramètres, ce qui donne un truc du genre:
    CALL ABSOLUTE (AX%,BX%,CX%,DX%, SADD(Code$))

    Pour les non-habitués (éventuels) du QuickBasic, ABSOLUTE demande l'éxécution de code machine, et SADD() fourni l'adresse du code machine à éxécuter. AX%, BX%... sont des variables de type entier qui sont passées en paramètres au programme en langage machine.

    Ma question est :
    Lorsque j'appel la routine en langage machine en lui passant les paramètres, où sont-il stockés pour être accessibles par la routine, et comment je peux les récupérér (en assembleur)?

    Je pourrais extrapôler un peu en vous demandant où et comment je récupère les arguments d'une ligne de commande d'un COM que j'aurais écrit en assembleur...

    J'espère avoir été assez clair dans mes explications... Je pense que pour vous cela va de soi, mais pour moi qui débute, c'est pas simple...

    Merci d'avance.

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Re:
    Au fait, en passant... j'ai lu un certain nombre de post des autres forums, et nottament le débat "Bidouilleur" VS "Pro"... Je tiens à signaler que je fais partie de la première assemblée, et que comme le disais fort bien l'un des membres, je me suis hissé à la force de mes neurones, fautes de moyens pour une formation adaptée...

    Je crois avoir trouvé ma réponse, mais si quelqu'un pouvait me dire si je suis dans le vrai....

    Les arguments seraient empilés dans la pile selon la convention C (je crois!) c-a-d du dernier argument vers le premier, et il faut les dépiler, en prenant soins de dépiler dans l'ordre, tout simplement...

    Est-ce bien cela ?

    Merci pour vos réponses...

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Je ne sais pas exactement si c'est ce que tu souhaites savoir, mais les paramètres sont soit passé par registres ou par la pile dans un programme assembleur. Dans le cas de la pile, il s'agit de LIFO (Last In First Out = Dernier entré, premier sorti), l'ajout/enlèvement dans la pile se fait donc comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PUSH AX
    PUSH BX
    PUSH CX
     
    POP CX
    POP BX
    POP AX
    D'autres te donneront probablement de plus amples informations si tu le souhaites.

    Bon codage,
    Did2604.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Re:
    Merci beaucoup...

    Finalement, je suis tjrs pas sûr, mais je crois que le passage se fait par pile...

    Si, dans mon cas, avec ABSOLUTE, je passe, dans cet ordre, AX, BX, CX, DX, alors il faut que je fasse un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MOV AX, [BP+6]
    MOV BX, [BP+4]
    MOV CX, [BP+2]
    MOV DX, [BP]
    ... et à la fin, je fait un RET 8 pour libérer les 8 octets occupés dans la pile...

    Ce code est-il valable ?

    Merci d'avance...

  5. #5
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 939
    Points : 59 418
    Points
    59 418
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Si, comme tu dis précédemment, les paramètres sont empilés dans l'ordre inverse de leur déclaration, ne serait-ce pas plutôt l'inverse ?
    Mais il ne faut également pas perdre de vue que l'adresse de retour est également empilée.

    Il faut tenir compte que BP doit également être empilé, dans la sous-routine, avant de prendre la valeur de SP.

    Sans certitude, je verrais l'état de la pile comme ceci :
    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
     
    |------|
    |  BP  | <-- BP
    |------|
    |  IP  | <-- BP + 2
    |------|
    |  CS  | <-- BP + 4
    |------|
    |  AX  | <-- BP + 6
    |------|
    |  BX  | <-- BP + 8
    |------|
    |  CX  | <-- BP + 10
    |------|
    |  DX  | <-- BP + 12
    |------|
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Re:
    Merci.

    Effectivement, je crois que tu as raison sur l'ordre de dépilement, Alcatîz.

    Cependant, je ne savais pas que IP étaient également empilés, et j'avais oublié pour BP... Ca fait bcp d'erreurs pour peu de code tout ça !


    Merci encore.

Discussions similaires

  1. Réponses: 11
    Dernier message: 06/09/2006, 12h48
  2. [PHP 4.4.2] Récupérer les paramètres d'une fonction
    Par stailer dans le forum Langage
    Réponses: 5
    Dernier message: 07/04/2006, 21h41
  3. Réponses: 3
    Dernier message: 15/03/2006, 03h19
  4. récupérer les paramètres dans une url
    Par asetti dans le forum ASP
    Réponses: 6
    Dernier message: 23/12/2005, 10h08
  5. [C#] - Récupérer les paramètres passés à une application
    Par linuxludo dans le forum Windows Forms
    Réponses: 4
    Dernier message: 14/11/2005, 14h41

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