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 :

Chercher des informations dans la pile


Sujet :

x86 16-bits Assembleur

  1. #1
    Invité
    Invité(e)
    Par défaut Chercher des informations dans la pile
    Bonjour,

    si j'ai bien compris, la pile est une zone de mémoire qui permet de conserver de manière temporaire des données (par exemple, l’état des registres lors d’un appel de procédure).
    Il faut utiliser alors le registre BP (géré par le programmeur) pour accéder à ces arguments (cela permet de se déplacer dans la pile pour accéder aux informations sans avoir à modifier SP), mais je ne vois pas comment utiliser BP pour ce que je veux faire.

    Mais comment fait-on exactement pour chercher des informations dans cette dernière quand on a fait juste avant ce genre d'instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mov ah, 13h; Nombre de l'interruption 10h qui permet d'afficher une chaine.
    lea bp, back; Pointeur vers la chaine back.	
    int 10h
    J'ai fait ça avec la chaîne back, puis avant avec la chaîne pvp.

    Ce que je cherche à faire, c'est lire dans des positions données, c'est à dire lire dans la position de back pour vérifier si il y a bien back, et lire dans la position de pvp si il y a bien pvp.

    Aussi, je crois que SP est incrémenter ou décrémenter de 2, donc ici, la position de back = position de pvp +2, non ?

    Merci d'avance pour votre aide.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    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 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Bonjour,

    Si j'ai bien compris, la pile est une zone de mémoire qui permet de conserver de manière temporaire des données (par exemple, l’état des registres lors d’un appel de procédure).
    Entre autre choses, oui. C'est également cette même pile qui contient les adresses de retour lors d'un CALL, et les langages de haut niveau l'exploitent aussi pour implémenter les variables locales. Tu peux toi-même t'en servir à toutes sortes de choses, à commencer par toutes les applications théoriques en informatique qui s'appuient sur l'usage d'une pile au sens général. À commencer par les fonctions récursives.

    Il faut utiliser alors le registre BP (géré par le programmeur) pour accéder à ces arguments (cela permet de se déplacer dans la pile pour accéder aux informations sans avoir à modifier SP), mais je ne vois pas comment utiliser BP pour ce que je veux faire.
    À noter que BP ne porte ce nom que sur x86. Tu peux tout-à-fait utiliser une approche similaire sur d'autres micro-processeurs. A contrario, rien ne t'oblige en tant que programmeur en assembleur à l'utiliser, même sur x86.

    « BP » signifie « Base Pointer ». En général, on empile BP puis on copie l'état du pointeur de pile SP dans BP. Ensuite, de là, on se sert du contenu de ce registre comme adresse de référence associée à un offset pour accéder aux différentes variables.

    Mais comment fait-on exactement pour chercher des informations dans cette dernière quand on a fait juste avant ce genre d'instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mov ah, 13h; Nombre de l'interruption 10h qui permet d'afficher une chaine.
    lea bp, back; Pointeur vers la chaine back.	
    int 10h
    J'ai fait ça avec la chaîne back, puis avant avec la chaîne pvp.
    Le plus simple est d'empiler BP, d'appeler ta fonction et de redépiler BP, comme tu le fais en entrant dans une procédure et en la quittant :

    Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        push bp
        mov ah, 13h;
        lea bp, back
        int 10h
        pop bp

    À noter toutefois que c'est le couple ES:BP et pas BP seul qui pointe ta chaîne. Il faut également passer un certain nombre d'infos, mais tu dois déjà le savoir : http://www.ctyme.com/intr/rb-0210.htm

    Ce que je cherche à faire, c'est lire dans des positions données, c'est à dire lire dans la position de back pour vérifier si il y a bien back, et lire dans la position de pvp si il y a bien pvp.
    Sur x86, Le plus simple est d'utiliser CMPS qui utilise les couples DS:SI et ES:DI. Mais pas BP.

    Aussi, je crois que SP est incrémenté ou décrémenté de 2, donc ici, la position de back = position de pvp +2, non ?
    Non. Tes chaînes sont dans le segment de données. Rien à voir avec la pile, sauf si tu empiles explicitement leurs adresses, ce qui n'est pas le cas ici. « SP » est toujours augmenté ou diminué de la taille de ce qu'il empile, donc ce ne sera pas toujours la même valeur.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour tes réponses, mais je crois que j'ai voulu m'embarquer dans quelque chose d'un peu trop complexe par rapport à ce que je veux faire fondamentalement.

    Finalement, j'ai une autre question majeur :
    je fais une comparaison qui me permet de diriger l'utilisateur vers une page, en fonction de la place du curseur quand celui si à appuyer sur la touche entrée (pour une navigation dans plusieurs menu en sélectionnant des options). Mon but, c'est qu'en fonction des différents choix faits, c'est tel ou tel fichier qui est chargé.

    J'ai donc pensé à incrémenter un registre (CX) dans une page que je n'affiche pas et qui ne servira qu'à ça.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    cmp dh, 05h     ; Vu qu'on a du appuyer sur entree on regarde ou le curseur etait et on redirige.
     
    mov ah, 02					; Nombre de l'interruption 10h qui est placer un curseur. 
    		            mov bh, 06                  ; Le curseur ce place sur la page 06, qui permettra le chargement du jeu.
    		            mov cx, 01                  ; Cliquer sur "2 joueurs" vaut 01, valeur que prend cx dans la page 06.
    		            int 10h
     
    je Joueur       ; Ici vers la page Joueur (03) => choix de la potence

    Mais d'après ce test peu concluant, j'ai cru comprendre que je ne peut pas remplir un registre que dans une page, chaque page n'ayant pas ses propres registres (je ne sais pas pourquoi j'ai cru ça ...)

    Donc j'ai trouvé un autre moyen, mais je ne sais pas du tout comment faire.

    Au lieu d'incrémenter CX comme je le faisais avant, je comptais écrire à la suite les 3 valeurs, pour ensuite les lire et les additionner, mais je ne sais pas si c'est possible de lire ce qui a déjà été afficher sur une page ...
    Peux-tu m'aider stp ?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 59
    Points : 88
    Points
    88
    Par défaut
    @Obsidian
    BP, à l'instar de SP, est associé au registre de segment de pile SS.
    Attention aux erreurs de frappe.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    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 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Citation Envoyé par MIG86 Voir le message
    @Obsidian
    BP, à l'instar de SP, est associé au registre de segment de pile SS.
    Attention aux erreurs de frappe.
    Ce n'est pas une erreur de frappe : on parle ici du pointeur de chaîne passé à la fonction 13h de l'interruption 10h.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Merci d'avoir pris le temps de me répondre

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 59
    Points : 88
    Points
    88
    Par défaut Mea culpa
    Au temps pour moi, il s'agit bien du couple ES:BP.
    La fonction 13h ne peut être utilisée que sur les AT, voire sur les PC et XT équipés d'une carte EGA (munie de son propre BIOS). Je ne l'ai guère utilisée et, par conséquent, je ne me rappelais pas qu'elle épuisait tous les registres généraux. D'où cet usage de BP.

Discussions similaires

  1. Chercher des mots dans une ligne
    Par chemouz dans le forum C++
    Réponses: 1
    Dernier message: 17/12/2005, 12h42
  2. afficher des informations dans un bloc div
    Par francky356 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 23/11/2005, 15h47
  3. [MySQL] Chercher des info dans une DB, et les afficher en lien
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/10/2005, 19h29
  4. chercher des rue dans une carte
    Par .:dev:. dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 21/09/2005, 10h29
  5. chercher des données dans sa propre requete...
    Par shadowbob dans le forum Requêtes
    Réponses: 4
    Dernier message: 27/06/2004, 17h13

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