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 :

Existence d'une pile et OS?


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 220
    Points : 100
    Points
    100
    Par défaut Existence d'une pile et OS?
    Bonjour à tous.

    Une machine (x86) qui bouterait sans OS, possède t'elle une pile en mémoire?

    Faut il en "construire" une pour faire fonctionner une application sans OS?


    D'avance, merci.

  2. #2
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Oui et oui

    le registre de segment de pile SS et le pointeur de pile SP
    pointent forcément quelque part, donc on peut empiler/dépiler

    Par contre, il faut faire attention d'initialiser correctement la pile
    pour ne pas écraser ni code ni données

    Dans un programme DOS .COM le segment de pile, le segment
    de code, et le segment de données ont la même valeur (SS=CS=DS)
    Et le pointeur de pile est en général initialisé avec une valeur proche
    de la fin du segment.
    Lors de l'empilage d'une valeur 16 bits, SP est décrémenté de 2 octets.
    La pile se "remplie" à l'envers.

    Chaque appel à un sous-programme utilise la pile, les interruptions
    logicielles ou matérielles utilisent la pile... on ne peut y échapper

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

    Au démarrage de l'ordinateur un processeur de la famille x86 fonctionne en real mode et ses registres sont initialés à des valeur précises. Pour un programmeur il est préférable de les remplacer par ses propres valeurs, donc définir une pile !
    (Tel qu'il est le cas dans un Bootscetor)
    Dernière modification par Invité ; 28/05/2013 à 17h30.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 220
    Points : 100
    Points
    100
    Par défaut
    Bonjour à tous.

    Merci pour ces éclaircissements.

    Dans le même registre (sans mauvais jeu de mot), est il vrai qu' on ne peut pas utiliser l'instruction RET car celle ci n'est utilisable qu'avec un OS en mémoire?


    D'avance, merci.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Oui on peut utiliser les instructions CALL/RET, puisqu'on a déjà la pile du programme
    principal (le programme appelant) !

  6. #6
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    à partir du moment où ton programme tourne sur une machine sans OS...
    il devient lui-même un OS puisque tu utilises ta machine avec

    Une fois que tu as initialisé la pile système, il n'y a pas de soucis à utiliser
    des CALL/RET, des PUSH/POP etc...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 220
    Points : 100
    Points
    100
    Par défaut
    Bonjour à tous.

    Merci pour ces précisions.

    Maintenant, ça me revient, j'avais lu ça quelque part. C'était pour un boot loader.

    Donc si je comprend bien, on ne peut pas utiliser de RET, PUSH et POP dans un boot loader car la pile n'a pas était explicitement mise en place, c'est bien cela?

    D'ailleurs, comment met on en place un pile? en donnant un valeur (une adresse) au SS et SP? Faut-il donner une taille? Si oui, comment?

    D'avance merci.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Juste après le démarrage de l'ordinateur, le processeur exécute un JMP vers le routine BIOS. Comment ? Avec les processeurs 30486 et Pentium I et la famille P6 les registres CS et EIP sont initialisé comme suit : EIP = 0xFFF0 et CS = 0xFFFF0000 (Selector = 0xF000, Limit = 0xFFFF , Base = 0xFFFF0000). Voir chapitre 8 : tableau 1 dans ce manuel : http://communities.intel.com/servlet...rogramming.pdf

    Ainsi, le processeur va exécuter l'instruction située à l'adresse 0xFFFFFFF0. C'est simplement un JMP vers le routine BIOS. Après les tests POST, le BIOS va chercher un disque bootable. Si il trouve un il charge le contenu de son bootsector (512 octets) dans la mémoire à l'adresse absolue 0x7C00. Le processeur commence l'exécution de cet adresse (CS:EIP = 0x7C0 : 0x0 => 0x7C0 x 0x10 0x7C00). Donc tu peut utiliser ce même segment de code comme segment de données et stack. C'est comme il a fait Linus Torvaldes dans le bootSector du noyau 0.01.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    go:	mov	ax,cs
    	mov	ds,ax
    	mov	es,ax
    	mov	ss,ax
    	mov	sp,#0x400		| arbitrary value >>512
    On est en real mode donc on peut choisir n'importe qu'elle zone mémoire pour créer le stack à condition qu'elle n'est pas réservée par INTEL ! La taille est automatiquement 64Ko et le SP pointe toujours vers le top de la pile, c-à-d l'avant dernier octets de SS.

  9. #9
    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 622
    Points
    23 622
    Par défaut
    Bonsoir,

    Citation Envoyé par flyingman Voir le message
    Donc si je comprend bien, on ne peut pas utiliser de RET, PUSH et POP dans un boot loader car la pile n'a pas était explicitement mise en place, c'est bien cela?
    À l'origine, une pile est une structure de donnée purement abstraite, utilisée par les théories du traitement de l'information. Maintenant, les micro-processeurs en eux-mêmes sont pour ainsi dire tous dotés d'instructions permettant d'en exploiter une, et s'appuient eux-mêmes sur ces mécanismes.

    Lorsque tu fais PUSH, le registre pointeur de pile (SP) est automatiquement décrémenté puis la valeur à empiler est déposée au nouvel endroit pointé. En ce sens, « PUSH AX », par exemple, est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        SUB SP,2
        MOV [SP],AX
    POP est l'opération réciproque. Dans ce cas, on commence par récupérer la valeur pointée, puis on incrémente le registre. « POP AX » ce qui est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        MOV AX,[SP]
        ADD SP,2
    Et maintenant que ces instructions existent, le micro-processeur lui-même va s'appuyer dessus. Lorsque tu fais un « CALL », le micro-processeur empile l'adresse de retour puis fait un saut à l'adresse indiquée. « CALL adresse » est donc équivalent à :
    Et pour finir, « RET » ne fait que dépiler une adresse mémoire préalablement empilée, en principe par CALL. « RET » est donc équivalent à :

    On comprend qu'ainsi, on peut soi-même aller lire ou altérer une adresse de retour, voire même simuler un CALL. Il suffit d'écrire dans la pile comme on le ferait n'importe où ailleurs. Les debuggers utilisent beaucoup cette possibilité. C'est pratique également pour supprimer l'adresse de retour si on rencontre un cas qui nous amène à ne pas revenir (un exec() ou un exit(), par exemple).

    D'ailleurs, comment met on en place un pile? en donnant un valeur (une adresse) au SS et SP?
    Tout-à-fait.

    Faut-il donner une taille? Si oui, comment?
    Non, parce que le micro-processeur ne fera pas plus de contrôle que ce que tu vois au dessus. Il peut même franchir le « 0000 » et revenir à la fin du plan mémoire, ça ne posera pas de problème s'il peut écrire dedans.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 220
    Points : 100
    Points
    100
    Par défaut
    Merci à vous pour toutes ces précisions! ça donne envie de faire un boot loader!

    Encore une petite question:

    Si un OS (DOS par exemple) est déjà en mémoire, dois-je définir ma propre plie pour faire exécuter mon programme ou bien puis-je (suis-je obligé?) d'utilisé celle de l'OS?

    D'avance merci.

  11. #11
    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 622
    Points
    23 622
    Par défaut
    Citation Envoyé par flyingman Voir le message
    Si un OS (DOS par exemple) est déjà en mémoire, dois-je définir ma propre plie pour faire exécuter mon programme ou bien puis-je (suis-je obligé?) d'utilisé celle de l'OS? D'avance merci.
    Un O.S., c'est un logiciel comme un autre. On lui donne le nom de « système d'exploitation » parce qu'il fournit et met en place les infrastructures qui permettent ensuite d'exécuter facilement des programmes sans avoir à tout réinventer à chaque fois, mais c'est de la même façon qu'un traitement de texte, par exemple, est un logiciel qui te permet de composer facilement des documents écrits.

    Si tu travailles sous D.O.S., celui-ci te mettra lui-même une pile en place quelque part au moment où il lancera ton programme. Tu peux déplacer ton pointeur de pile ailleurs si tu le souhaites à condition de le restaurer à son état initial avant de quitter ton programme (sinon D.O.S. ne retrouvera plus ses petits), et de prévoir suffisamment de place pour tes besoins ET ceux du système (en prévoyant notamment les interruptions matérielles).

    Si par contre tu travailles sur des systèmes plus évolués, par exemple Linux ou Windows en mode protégé et en 32 bits ou 64 bits, ce sera un poil plus compliqué car le système va effectuer allouer des zones de mémoire distinctes pour la pile, les données et le code. Tu pourras toujours modifier ton pointeur de pile si ça te chante mais seulement au sein du segment alloué, ce qui n'a pas beaucoup d'intérêt en soi. Si tu veux aller plus loin, il faudra passer en mode privilégié et expliquer tout cela au système. Et là, on n'est plus du tout dans la même catégorie…

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 220
    Points : 100
    Points
    100
    Par défaut
    Ok merci pour vos réponses.

    Je résumes par écrit (ça m'aider à mémoriser ):

    Je peut faire ma propre pile.
    Je peut utiliser la pile de L'OS.
    Il est fortement recommander d'utiliser la pile de l'OS.

    Cordialement.

  13. #13
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 434
    Points : 43 067
    Points
    43 067
    Par défaut complément pile
    Flyinman, tu mettre ta pile n’importe ou tu veux en mémoire, un OS ne te permet pas de modifier ss:esp comme tu veux, Si besoin, il te faut passer par la routine du système te permettant de le faire.

    Si tu bootre sur ton propre code, tun mets ta pile ou tu veux en mémoire, il faut faire attention à ce que ta pile n'écrase pas ton code exemple la fin de ton code se trouve à l'adresse 0x0010 ton registre de pile se trouve à l'adresse 0x0014 si tu fais push ax, sp va avoir comme valeur 0x12, un autre push ax : adresse 0x10, et enfin un autre : adresse 0x08 le code entre 0x0008 et 0x0010 va être remplacé par l'empilement donc va être écrasé.

    Quand tu es en mode protégé, si tu crée un segment spécifique ou une page spécifique pour la pile, tu tu sors de la zone déterminée tu aura une exception.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 220
    Points : 100
    Points
    100
    Par défaut
    OK, merci encore. Je vais lire tout cela à tête reposée

    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/10/2005, 12h46
  2. [JDBC]Tester l'existence d une table
    Par juflata dans le forum JDBC
    Réponses: 7
    Dernier message: 29/06/2004, 15h27
  3. [SQL - ASP] existance d'une table
    Par Larson dans le forum ASP
    Réponses: 4
    Dernier message: 02/06/2004, 10h41
  4. [VB.NET] Vérification d'existance d'une table
    Par Hoegaarden dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/05/2004, 10h17
  5. [ADO] Tester l'existence d'une table
    Par nd25 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 05/09/2002, 13h55

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