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 :

Passage en mode protégé avec DPMI


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre à l'essai Avatar de Hell_Hibou
    Homme Profil pro
    Dévelopeur
    Inscrit en
    Septembre 2003
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Dévelopeur

    Informations forums :
    Inscription : Septembre 2003
    Messages : 10
    Points : 11
    Points
    11
    Par défaut Passage en mode protégé avec DPMI
    J'ai créé un petit programme DOS qui permet de passer en
    mode protégé. Il utilise le driver cwsdpmi.exe v0.9 (Serveur DPMI) .

    Je récupère l'adresse de la fonction de passage en mode protégé
    en utilisant la fonction 1687h de l'interruption 2Fh.
    J'alloue ensuite un bloc de memoire et j'appelle la fonction de
    passage en mode protégé.

    Le programme s'arrête et le message suivant s'affiche à l'écran :
    General Protection Fault at eip=107; flags=3202
    eax=00042459 ebx=00000006 ecx=00000f06 edx=0000005a esi=00000ab4 edi=00080ad2
    ebp=00000000 esp=00001002 cs=87 ds=8f es=97 fs=0 gs=0 ss=a7 error=3b60
    Voici mon programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
          mov AX, 1687h
          int 2Fh
          mov word ptr [Fct],   di
          mov word ptr [Fct+2], es
          mov  bx, si
          mov  ah, 48h
          int  21h
          mov  ES, ax
          call Fct
    Quelqu'un saurrait-il me dire pourquoi ce programme plante ?

    P.S. : Ce petit programme utilisé dans un Bloc asm {... }
    de la fonction main dans un programme C compilé avec
    Borland C (mais ça ne change rien au fait que c'est
    de l'assembleur).

    Merci d'avance.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mov word ptr [Fct+2], es
    ca compile ca ??

    J'arrive pas a avoir de description de la fonction que tu appelle via l'int 2Fh.

    Tu peux désassemebler ton prog, pour voir ou est l'instruction de l'eip 107 ?

  3. #3
    Membre à l'essai Avatar de Hell_Hibou
    Homme Profil pro
    Dévelopeur
    Inscrit en
    Septembre 2003
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Dévelopeur

    Informations forums :
    Inscription : Septembre 2003
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     mov word ptr [Fct+2], es
    Oui ça compile ... avec un compilateur C. Mais cette syntaxe m'a été donné dans un forum assembleur donc ça devrais marcher aussi avec un compilateur assembleur.

    La fonction que j'apelle via l'interruption 2Fh est une fonction du driver DPMI. Cette fonction retourne un pointeur sur une fonction qui permet de passer en mode protégé (avec le driver DPMI).
    J'ai eu la doc ici.

    Le message avec l'état des registres est affiché par le driver DPMI lorsque j'apelle la fonction Fct. Ca plante lorsque je fait le "call Fct" (enfin je crois).


    Je ne vois pas pourquoi ça plante, t'a pas une idée :

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2002
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 8
    Points : 10
    Points
    10
    Par défaut
    Peut-être parce que le pointeur retourné par la fonction 1687h est un pointeur far (segment:offset) et que toi tu fais un call near (juste l'offset).
    Je n'ai pas le temps de tester mais essaye ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    mov AX, 1687h
    int 2Fh
    mov word ptr [Fct], di
    mov word ptr [Fct+2], es
    mov bx, si
    mov ah, 48h
    int 21h
    mov ES, ax
           db    09Ah    ; opcode du call far, revient à faire call [Fct+2]:[Fct]
    Fct   dw   0          ; offset
           dw   0          ; segment

  5. #5
    Membre à l'essai Avatar de Hell_Hibou
    Homme Profil pro
    Dévelopeur
    Inscrit en
    Septembre 2003
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Dévelopeur

    Informations forums :
    Inscription : Septembre 2003
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    C'est bon, pour appeller une fonction FAR je devais faire
    merçi beaucoup pour ton tuyaux.

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

Discussions similaires

  1. problème avec le passage en mode .EXE
    Par za3im_ensa dans le forum LabVIEW
    Réponses: 2
    Dernier message: 21/07/2011, 16h56
  2. Réponses: 4
    Dernier message: 02/12/2008, 06h32
  3. Passage en mode protégé
    Par Nyarlathotep dans le forum Assembleur
    Réponses: 1
    Dernier message: 02/02/2007, 20h39
  4. Problème avec un secteur de boot en mode protégé...
    Par Nico*3-3 dans le forum Assembleur
    Réponses: 17
    Dernier message: 10/02/2005, 19h32
  5. Passage en mode protégé
    Par jojo's dans le forum Assembleur
    Réponses: 14
    Dernier message: 10/07/2004, 23h50

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