begin process at 2012 05 24 03:40:11
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

divers

 > PASSER EN MODE PROTÉGÉ [MASM]

PASSER EN MODE PROTÉGÉ [MASM]


 Information sur la source

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :divers Niveau :Initié Date de création :15/12/2002 Date de mise à jour :15/12/2002 10:19:24 Vu :4 250

Auteur : gblade

Ecrire un message privé
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

 Description

Voici un code simple pour passer en mode protégé et revenir en mode réel.
Comme le seul fait de passer en PMODE me semble assez incomplet, le code charge également la GDT.

Le programme une fois assemblé ne fait RIEN (et oui le PMODE c'est invisible).
Il se lance sous DOS toutefois il est en 32bits et utilise une segmentation de type flat. Vous remarquerez sans doute qu'en mode protégé on utilise 2 descripteur pour le même segment, ceci vient du fait que le premier désigne le segment de code (possédant les droits de lecture/exécution) tandis que le second est le segment de données/pile (possédant les droits de lecture/écriture).

Si vous désirez avoir plus de renseignement sur le PMODE et plus (le multitâche ou le paging), faites un tour sur http://developer.intel.com

Source

  • .386p
  • .dosseg
  • assume cs:pmode,ds:pmode,ss:pmode,es:pmode,fs:nothing,gs:nothing
  • pmode segment public use32
  • startGDT: ;la GDT
  • null dw 0,\ ;le descripteur nul
  • 00h
  • db 00h,\
  • 00000000b,\
  • 00000000b,\
  • 00h
  • code32 dw 00ffffh,\ ;le descripteur du segment de code
  • 00h
  • db 00h,\
  • 10011010b,\
  • 11001111b,\
  • 00h
  • data32 dw 00ffffh,\ ;le descripteur du segment de données/pile
  • 00h
  • db 00h,\
  • 10010010b,\
  • 11001111b,\
  • 00h
  • endGDT:
  • pGDT dw endGDT-startGDT-1 ;le pointeur sur la GDT
  • dd 0
  • startup: ;point d'entrée du programme
  • mov eax,pmode ;initialise le selecteur du segment de données
  • mov ds,eax
  • mov eax,ds ;initalise du pointeur sur la GDT
  • shl eax,4
  • add eax,startGDT
  • mov dword ptr [pGDT+02h],eax
  • mov eax,pmode ;sauvegarde le segment courant
  • mov gs,eax
  • cli ;désactive les interruptions masquables
  • in eax,70h ;désactive les NMIs
  • or eax,10000000b
  • out 70h,eax
  • mov eax,cr0 ;teste la présence du mode protégé
  • test eax,00000001b
  • jnz exit ;génère une erreur (une sortie directe du programme) si le CPU est déjà en PMODE
  • lgdt fword ptr [pGDT] ;charge la GDT en mémoire
  • or eax,00000001b ;passe en mode protégé
  • mov cr0,eax
  • jmp far ptr entry ;reinitialise la queue d'instructions
  • entry:
  • mov eax,10h ;reinitialise le sélecteur du segment de données
  • mov ds,eax
  • mov ss,eax ;reinitialise le sélecteur du segment de pile
  • mov esp,1000000h
  • mov es,eax ;reinitialise le sélecteur du segment de données supplémentaire
  • mov eax,cr0 ;repasse en mode réel
  • and eax,01100000000000000000000000010000b
  • mov cr0,eax
  • jmp far ptr back ;reinitialise la queue d'instructions
  • back:
  • mov eax,gs ;reinitialise le sélecteur du segment de données
  • mov ds,eax
  • mov ss,eax ;reinitialise le sélecteur du segment de pile
  • mov es,eax ;reinitialise le sélecteur du segment de données supplémentaire
  • exit:
  • in eax,70h ;réactive les NMIs
  • and eax,7fh
  • out 70h,eax
  • sti ;réactive les interruptions masquables
  • mov eax,4c00h ;rend le contrôle au DOS
  • int 21h
  • pmode ends
  • end startup
.386p
.dosseg

assume cs:pmode,ds:pmode,ss:pmode,es:pmode,fs:nothing,gs:nothing


pmode segment public use32

startGDT:			;la GDT
null dw 0,\			;le descripteur nul
  00h
db 00h,\
  00000000b,\
  00000000b,\
  00h
code32 dw 00ffffh,\		;le descripteur du segment de code
  00h
db 00h,\
  10011010b,\
  11001111b,\
  00h
data32 dw 00ffffh,\		;le descripteur du segment de données/pile
  00h
db 00h,\
  10010010b,\
  11001111b,\
  00h
endGDT:

pGDT dw endGDT-startGDT-1		;le pointeur sur la GDT
dd 0

startup:		;point d'entrée du programme
mov eax,pmode		;initialise le selecteur du segment de données
mov ds,eax

mov eax,ds				;initalise du pointeur sur la GDT
shl eax,4
add eax,startGDT
mov dword ptr [pGDT+02h],eax

mov eax,pmode		;sauvegarde le segment courant
mov gs,eax

cli		;désactive les interruptions masquables

in eax,70h		;désactive les NMIs
or eax,10000000b
out 70h,eax

mov eax,cr0		;teste la présence du mode protégé
test eax,00000001b
jnz exit		;génère une erreur (une sortie directe du programme) si le CPU est déjà en PMODE

lgdt fword ptr [pGDT]		;charge la GDT en mémoire

or eax,00000001b		;passe en mode protégé
mov cr0,eax

jmp far ptr entry		;reinitialise la queue d'instructions

entry:
mov eax,10h		;reinitialise le sélecteur du segment de données
mov ds,eax

mov ss,eax		;reinitialise le sélecteur du segment de pile
mov esp,1000000h

mov es,eax		;reinitialise le sélecteur du segment de données supplémentaire

mov eax,cr0						;repasse en mode réel
and eax,01100000000000000000000000010000b
mov cr0,eax

jmp far ptr back		;reinitialise la queue d'instructions

back:
mov eax,gs		;reinitialise le sélecteur du segment de données
mov ds,eax

mov ss,eax		;reinitialise le sélecteur du segment de pile

mov es,eax		;reinitialise le sélecteur du segment de données supplémentaire

exit:
in eax,70h		;réactive les NMIs
and eax,7fh
out 70h,eax

sti		;réactive les interruptions masquables

mov eax,4c00h		;rend le contrôle au DOS
int 21h

pmode ends


end startup

 Conclusion

Pour ceux qui ne sauraient pas "GDT" veut dire "Global Descriptor Table" et NMI "Non-Maskable Interruption".


 Sources du même auteur

Source avec Zip [COM] CRÉATION D'UN OBJET VIDE (QUI NE FAIT RIEN) [MASM,32BI...
Source avec Zip [COM] CRÉATION DE RACCOURCIS [MASM32]

 Sources de la même categorie

Source avec Zip Source avec une capture MINI DEBUG par parki
Source avec une capture DESSIN DE RECTANGLES (POSITION, TAILLE, COULEUR, ÉPAISSEUR) par macsou01
RECHERCHE DES PALINDROMES D'UN TEXTE SAISI. par PCBill
Source avec Zip LIBRAIRIE GRAPHIQUE (ET PLUS) EN MODE RÉEL par epineurien
Source avec Zip Source avec une capture LIB PROGRESSBAR (PERSONNALISABLE , DÉGRADÉ DE COULEUR,POURCE... par knetus

Commentaires et avis

Commentaire de Bombela le 26/06/2004 13:22:11

Le CLI désactive TOUTES les interruptions !
C'est le CPU qui ne vas plus réagirs au interruptions !
Donc, ça sert à rien de programmer le PIC du PC pour masquer les interruptions !

@+

Commentaire de TheLudo2013 le 03/08/2004 11:53:16

bombela < les nmi (non-maskable interrupt) bien que quasiment jamais déclenchées (enfin vaut mieux pas, puisqu'elle signifient par ex. que la ram est dead) ne sont pas inhibées par "cli" ;)
la programmation du pic est donc indispensable pour les inhiber....

Commentaire de Bombela le 03/08/2004 13:49:45

Oui ! Tu a tout a fait raison !

Je me suis aperçus de ma bourde un peux plus tard !
Mais comme t'avais pas répondu, j'ai pas pris le temps de corriger !

Mauvais garçons que je suis ! Blaf ! Une baffe pour moi ;0)

@+

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales