Précédent   Forum du club des développeurs et IT Pro > Autres langages > Assembleur > x86 16-bits
x86 16-bits Architecture x86 16 bits et ses outils (assembleurs, debuggers, émulateurs...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 22/05/2011, 17h46   #1
7ch0uk
Invité de passage
 
Inscription : mai 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 9
Points : 0
Points : 0
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.
7ch0uk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 00h43   #2
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 610
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

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

Informations forums :
Inscription : septembre 2007
Messages : 4 610
Points : 11 068
Points : 11 068
Bonjour,

Citation:
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.

Citation:
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.

Citation:
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

Citation:
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.

Citation:
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.
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 09h26   #3
7ch0uk
Invité de passage
 
Inscription : mai 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 9
Points : 0
Points : 0
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 ?
7ch0uk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 20h34   #4
MIG86
Membre du Club
 
Inscription : novembre 2010
Messages : 50
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 50
Points : 66
Points : 66
@Obsidian
BP, à l'instar de SP, est associé au registre de segment de pile SS.
Attention aux erreurs de frappe.
MIG86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 21h44   #5
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 610
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

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

Informations forums :
Inscription : septembre 2007
Messages : 4 610
Points : 11 068
Points : 11 068
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.
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 15h57   #6
7ch0uk
Invité de passage
 
Inscription : mai 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 9
Points : 0
Points : 0
Merci d'avoir pris le temps de me répondre
7ch0uk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 22h21   #7
MIG86
Membre du Club
 
Inscription : novembre 2010
Messages : 50
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 50
Points : 66
Points : 66
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.
MIG86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 16h36.


 
 
 
 
Partenaires

Hébergement Web