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 :

Flat real mode


Sujet :

Assembleur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 10
    Par défaut Flat real mode
    Salut tout le monde.
    J'ai vu plein de manière de remplir une gdt. Mais le problèmes c'est que ces facons différentes se contredisent. Certains programme remplissent leur gdt dynamiquement a l'éxécution d'autre sont 80% remplis par des constantes...

    Une fois passé en pmode. Il faut je crois initialiser ds,es,gs et fs pour avoir accès a la mémoire.

    En fait j'essaie de faire du flat real mode. J'ai bien un programme avec source qui le fait et qui fournit même une fonctiond d'installation qu'il suffit de linker pour pouvoir l'utiliser. Mais je ne comprend pas sont fonctionnement et je ne veux pas prendre le partis d'utiliser ca tel quel sans le comprendre. Donc si quelqu'un pouvait me résumer les étapes a obligatoire pour utiliser le flat real mode et avoir accès a toute la mémoire de facon linéaire. Et surtout m'expliquer comment on remplit la gdt et ce que l'on DOIT mettre dans les registre une fois en pmode. Parceque mon programme fonctionne quand je passe en pmode mais si je fait un accès quelquconque a la mémoire ca reboot...:s

    Merci de m'aider

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 10
    Par défaut
    Laissez tomber !!! J'ai trouvé !!!!

  3. #3
    Membre confirmé Avatar de - Robby -
    Inscrit en
    Juillet 2003
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 266
    Par défaut
    Bein oui, mais explique ... ca intéresse !
    merci a toi !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 10
    Par défaut
    En fait j'ai trouvé un document en francais tout simplement est en 1h j'ai fini mon programme. C'était juste un problème de remplissage de GDT et d'initialisation des registres une fois en pmode.

    Pour ceux qui veulent, voila le code de chargement d'une GDT qui crée un méga segment de 4Go :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     
    jmp prog
     
    gdt:
            dw 0,0,0,0
    gdt_ds:
            dw 0FFFFh,0000h,9200h,008Fh
    gdtend:
     
    gdtptr LABEL FWORD
            gdt_size dw 15
            gdt_base dd offset gdt
     
    prog:
            cli
     
            ;;On prépare le pointeur sur la gdt
            mov eax,0
            mov ax,cs
            shl eax,4
            add gdt_base,eax
     
            ;; On charge notre GDT
            mov bx,offset gdtptr
            lgdt fword ptr [bx]
    C'est au format TASM. N'oubliez surtout pas sous peine de plantage la mention use16 dans la déclaration du segment de code.

    Théoriquement il faudrait en plus du cli inhiber les NMIs, ce n'est pas très compliqué mais je ne le fait pas car a ma connaissances il n'y a qu'une seul NMI qui se déclence quand le circuit éléctronique de la RAM est endomagé, ce qui n'arrive pas tout les jours.

    Bon maintenant qu'on a une GDT il faut passer en PMODE, initialiser les sélecteurs (registres segment) et repasser en mode réel.

    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
     
    ;; On commute en mode protégée
            mov eax,cr0
            or al,1
            mov cr0,eax
            jmp $+2
     
            mov bx,8
            mov fs,bx
            mov gs,bx
     
            ;; On revient en mode réel
            and al,not 1
            mov cr0,eax
            sti
    Bon alors le jmp $+2 c'est un saut short et oui pas besoin de saut FAR comme je l'ais lu des millier de fois. Et pour revenir en mode réel, pas besoin de saut du tout. J'ai initialiser uniquement les registre fs et gs comme ca les registre data segment et extra segment utiliser par les programme en mode réel reste en addressage segmenté et si vous avez besoin d'accèder a plus de mémoire ou a plus de 64Ko d'un coup il suffit d'utiliser fs ou gs sans modifier son contenu et de mettre un offset 32 bits genre ESI ou EDI.

    Et pour vérifier que le flat real est opérationnel on peut faire ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            mov al,'a'
            mov ah,00011111b
            mov fs:[0B8000h],ax
     
            mov ah,09h
            lea dx,msg
            int 21h
    Bon évidement pour msg vous devez délcalrer une variable contenant du texte et finissant par $... Et vous remarquerez qu'en mode flat la mémoire n'est pas mappé comme en mode réel. La mémoire vidéo n'est plus a B800h mais a B8000h de même que pour les modes graphique, ce n'est plus A000h mais A0000h...

    En conclusion sachez que cette méthode n'est pas compatible avec les gestionnaires de mémoire hautes du DOS donc il faut retirer le hymem.sys de votre config.sys. Ce code ne vérifie pas la présence du mode Virtual 86 mais sachez qu'il ne peut s'executer que sous DOS et pas dans une console sous Windows.

    Et enfin n'oubliez pas la directive .386P ou P386 pour compiler ce programme. Pour ceux qui auraient la flemme de le recopier, je peut leur envoyer sur demande la source complète a la norme TASM qui devrait aussi se compiler sous MASM...

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

Discussions similaires

  1. Mode Réel et accès mémoire FLAT
    Par Forthman dans le forum Contribuez
    Réponses: 1
    Dernier message: 03/01/2014, 11h59
  2. Le grand mode d'emploi du forum, à lire si vous souhaitez tout savoir !
    Par Anomaly dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 03/06/2013, 17h36
  3. [BP7] Unit, Overlay, Real mode, DPMI
    Par Transgarp dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 10/04/2008, 18h46
  4. Réponses: 17
    Dernier message: 17/10/2002, 20h06
  5. Passer en mode 800*600
    Par flavien tetart dans le forum Assembleur
    Réponses: 8
    Dernier message: 30/05/2002, 23h05

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