Comment basculer dans le mode virtuel 8086 : V86 ?

Pour discuter de l'assembleur
Lna
Messages : 181
Inscription : mar. 21/juin/2005 11:11

Comment basculer dans le mode virtuel 8086 : V86 ?

Message par Lna »

Bonjour à toutes et à tous,

Afin de pouvoir bénéficier des avantages du mode protégé et du mode réel à la fois, je souhaiterai accéder au mode virtuel V86, mais lorsque j'essaye de basculer dans ce mode en placant le bit 17 VM de EFLAGS, celui-ci ne semble pas être modifié.
Peut-être que cela n'affecte pas, ce qui est appelé TSS.

Voici les informations que j'ai pu recueillir :
Positionner le flag PE du registre CR0 à 0 te permettera de passer en mode réel donc logiquement ton compilateur interprétera ton code en mode réel.
Le mode v86 alias Virtual-86 est en faite une émulation du mode réel dans un mode protégé ce qui te donne tout les avantages du mode protégé.
Le mode dos dans les système à base du noyau NT est réalisé en mode V86.

Pour passer en mode V86, il faut positionner le flag VM du registre EFLAGS à 1

Code : Tout sélectionner

Procedure.l test()

  ; pour mettre le bit VM à 1

  PUSHFD           ; copie EFLAGS 32 bits dans la pile
  POP EAX          ; charge dans EAX le contenu de EFLAGS

  OR EAX,$00020000 ; mise à 1 du FLAG 17 VM

  PUSH EAX         ; copie la modification de EFLAGS dans la pile
  POPFD            ; remplace EFLAG modifié

  ; pour verifier que le bit VM à bien été placé à 1

  PUSHFD           ; copie EFLAGS 32 bits dans la pile
  POP EAX          ; charge dans EAX le contenu de EFLAGS

  ProcedureReturn  ; retour du contenu d'EAX

EndProcedure 

Debug Bin(test())  ; et on ne vois pas le bit 17 à 1
On entre dans le mode Virtuel 8086 en mettant à un le flag VM; il y a deux manières de faire :

lors d'un changement de tâche ( Task Switch ) vers une tâche 386 SX , il y a chargement du registre des indicateurs ( EFLAGS ) à partir du nouveau TSS. Ainsi, si le flag VM du nouveau EFLAGS est à un, cela indique que la nouvelle tâche exécutera un programme 8086.
L'instruction de retour d'interruption ( IRET ) d'une tâche 386 charge le registre des indicateurs à partir de la pile. Si le niveau de privilège courant n'est pas à 0, le processeur ne peut pas modifier l'état du flag VM ( les adresses sont formées telles que le 8086 le ferait ).
Lorsqu'un changement de tâche est effectué, les registres de segment sont chargés à partir d'un TSS ( Task State Segment ); l'instruction IRET est alors utilisée pour mettre à un le flag VM. Ces registres doivent être par la suite rechargés de manière logicielle avec les selecteurs de segment appropriés.

Le processeur sort du mode Virtuel lors d'une interruption ou d'une exception. Il y a deux cas possibles :

L'interruption ou l'exception provoque un changement de tâche. Le nouveau EFLAGS est chargé à partir du TSS ; si le flag VM du nouveau est à 0, alors le processeur met à 0 le flag VM du registre des indicateurs, puis charge les registres de segments à partir du nouveau TSS en utilisant la formation des adresses propre au 386 SX.
L'interruption ou l'exception fait un appel à une procédure de niveau de privilège 0 ( la plus privilégiée ). Le processeur met la valeur du registre des indicateurs dans la pile et met à 0 le flag VM. Le gestionnaire d'interruption fonctionnera alors en mode protégé.
Le logiciel système ne change pas directement la valeur du flag VM, mais modifie son image dans la pile ou dans le TSS.
Merci d'avance pour votre aide.

A +