+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  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 :
    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
    Responsable Modération
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 516
    Points : 14 180
    Points
    14 180

    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 :
    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 :
    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 :
    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
    Inscrit en
    novembre 2010
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : novembre 2010
    Messages : 51
    Points : 75
    Points
    75

    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
    Responsable Modération
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 516
    Points : 14 180
    Points
    14 180

    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
    Inscrit en
    novembre 2010
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : novembre 2010
    Messages : 51
    Points : 75
    Points
    75

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •