A un point ou un autre de son execution ,tout client DPMI s'exécute sur quatre piles differentes: une pile d'application, une pile verrouillée en mode protégé , une pile mode réel,et la pile de l'hôte DPMI . Il est important de comprendre comment l'hôte gère ces piles pour bien assimiler l'environnement en mode protégé .

La pile d'application est la première que le client DPMI exécute. C'est initiallement la pile en mode réel que le client emploie avant de basculer en mode protégé, bien que rien ne le previenne après le changement de mode . La pile d'application peut être deverrouillée si desiré. Les interruptions logicielles executées en mode protégé se servent de cette pile.

La pile verrouillée en mode protégé est fournie par l'hôte DPMI. L'hôte bascule automatiquement sur cette pile pendant les interruptions matérielles, interruptions logicielles 1CH, 23H, et 24H,toutes les exceptions, et pendant l'exécution des callbacks mode réel. Les interruptions imbriquées ou les appels ne provoquent pas de changement de pile. Si le client arrète cette pile, la nouvelle doit être verrouillée et devient la pile en mode protégé jusqu'a ce qu'il revienne en arrière . Lors du retour d'une interruption ou d'un appel, l'hôte bascule sur la pile originale en mode protégé. Notez que l'hôte doit fournir une pile verrouillée d'un d'un minimum de 4 Ko, et que les interruptions logicielles autres que 1CH, 23H, et 24H n'utilisentPAS cette pile.

La pile mode réel est également fournie par l'hote DPMI, et est usuallement située dans la zone de données de l'hôte DPMI allouée par le client avant so passage en mode protégé. La pile mode réel a au moins une taille de 200H octets et est toujours placée en memoire verrouillé. Les interruptions qui sont renvoyées au mode réel , ainsi que les appels aux gestionnaires d'interruptions en mode réel ou les procedures via Int 31H Fonctions 0300H, 0301H, ou 0302H, utilisent cette pile.

La pile de l'hôte DPMI est seulement accessible à l'hôte DPMI; elle est utilisée par l'hôte pour gerer les interruptions et exceptions que l'hôte exécute pour le compte du client. Par exemple, quand le client requiert un changement de mode , l' original SS:(E)SP du programme en mode protégé peut être préservé sur la pile de l'hôte pendant que l'hôte DPMI bascule sur la pile verrouillé en mode protégé.

Il y a quatre manières différentes pour un client de forcer un changement de mode entre mode protégé et mode réel:

Tous ces changements de mode excepté les "raw" doivent sauvegarder quelque information sur la pile de l'hôte DPMI. Cela signifie que le client ne doit pas se terminer dans des changements de mode imbriqués à moins qu'il utilisent les fonctions "raw" . Quoiqu'il en soit, même les clients qui emploient les fonctions "raw" ne doivent pas essayer de terminer après une interruption materielle,un gestionnaire d'exception ou un callback mode réel car l'hôte DPMI gère automatiquement les changements de mode et de pile pendant ces évŠnements.

Les clients qui utilisent les services de changements de mode "raw" et qui pratiquent des changements de mode imbriqués doivent utiliser les fonctions DPMI de sauvegarde/restauration dont les adresses sont obtenues avec Int 31H Fonction 0305H), ce qui amène l'hôte à conserver l'information sur l'état courant de "l'autre" mode. Cette information inclue CS:(E)IP,SS:(E)SP, et les autres contenus des registres de segment ; valeurs que le client ne peut pas acceder directement. Par exemple, pendant une inte0rrption matérielle qui survient en mode réel, l'hôte DPMI peut preserver CS:(E)IP, SS:(E)SP en mode réel et les registres de segment sur sa propre pile provoquant un retour à une mauvaise adresse quand le gestionnaire execute l'instruction IRET finale.

Exemple: Cet exemple illustre le code qui sauvegarde l'état des registres en mode réel en utilisant la fonction DPMI de sauvegarde/restauration,bascule en mode réel en utilisant la fonction "raw" ,envoie un appel DOS d'ouverture de fichier,repasse en mode protégé,en utilisant la fonction "raw", et restaure l'état des registres en mode réel en utilisant les fonctions de sauvegarde/restauration. Les registres en mode protégé sont preservés sur la pile de manière usuelle. Cet exemple est seulement destiné à montrer la sequence logique d'éxecution; dans un programme réel, les variables et fonctions mode réel/protégé devrait être réparties dans des segments separés.


savsiz  dw      0                       ; taille de l'état
realsrs dd      0                       ; pointeur far mode réel
                                        ; point d'entrée de sauvegarde/restauration 
protsrs dd      0                       ; pointeur far mode protégé
                                        ; point d'entrée de sauvegarde/restauration
realrms dd      0                       ; pointeur far mode réel
                                        ; point d'entrée "raw" mode  
protrms dd      0                       ; pointeur far mode protégé
                                        ; point d'entrée "raw" mode

protdw  dw      0                       ;emplacement pour DS en mode protégé 
protip  dw      0                       ;emplacement pour IP enmode protégé 
protcs  dw      0                       ;emplacement pour CS en mode protégé 
protsp  dw      0                       ;emplacement pour SP en mode protégé 
protss  dw      0                       ;emplacement pour SS en mode protégé 
	.
	.
	.

                                        ; Ce code est executé pendant
                                        ; l'initialisation de l'application

        mov     ax,305h                 ; obtient l'addresse of DPMI host's
        int   31h                 ; point d'entrée etat de sauvegarde/restauration 
	mov	savsiz,ax		; taille du buffer d'etat
	mov	word ptr realsrs,cx	; BX:CX =etat de sauvegarde/restauration
        mov     word ptr realsrs+2,bx   ; point d'entrée du mode reel
	mov	word ptr protsrs,di	; SI:DI = etat de sauvegarde/restauration
        mov     word ptr protsrs+2,si   ; point d'entrée du mode protégé

	mov	ax,306h			; obtient l'adresse de l'hote DPMI
        int   31h                 ; point d'entrées mode raw
	mov	savsiz,ax		; sauvegarde taille du buffer d'etat
	mov	word ptr realrms,cx	; BX:CX = point d'entrée mode raw
	mov	word ptr realrms+2,bx	; point d'entrée mode reel
	mov	word ptr protrms,di	; SI:DI = raw mode switch
        mov     word ptr protrms+2,si   ; point d'entrée du mode protégé
					; on doit aussi initialiser les
                                        ; variables sp et realss
	.
	.
	.

					; ce code est execute durant
					; l'execution du programme
callopenfile proc
        pusha                           ; sauvegarde registres mode protégé 
	push	es

        sub     sp,savsiz               ; alloue espace sur la pile courante
	mov	di,sp			; pour sauvegarder l'etat mode reel
	mov	ax,ss			; set ES:DI = adresse du buffer
	mov	es,ax			; qui recoit l'information d'etat
	xor	al,al			; AL=0 requete de sauvegarde d'etat
	call	protsrs			; appel de la routine de sauvegarde/restauration

	mov	protds,ds		; sauve DS pour switch back
	mov	protss,ss		; sauve SS courant 
	mov	protsp,sp		; sauve SP courant 
	mov	protip,offset returnfromreal ; sauve IP return 
	mov	protcs,cs		; sauve CS return 

	mov	ax,seg filename		; charge  DS mode reel
	mov	ds,realss		; charge  SS mode reel
	mov	bx,realsp		; charge  SP mode reel
	mov	si,seg openfile		; charge  CS mode reel
	mov	di,offset openfile	; charge  IP mode reel
	
	jmp	protrms			; appel ouverture de fichier

returnfromreal:
	mov	ax,ss			;  ES:DI = adresse du buffer
	mov	es,ax			; qui recoit l'information d'etat
	mov	di,sp
	mov	al,1			; AL=1 pour restaurer l'etat
	call	protsrs			; appel de la routine de sauvegarde
	add	sp,savsiz		; 
	pop	es
        popa                            ; restaure registres mode protégé 
	ret
callopenfile endp

	.
	.
	.
	
					; ce code est execute enn mode reel
openfile proc
	mov	dx,offset filename
	mov	ah,3dh			; fonction DOS d'ouverture
	int	21h
	jc	openerr			; test d'erreur
	mov	filehandle,bx		; sauvegarde handle
        mov     ax,protds               ; charge DS mode protégé 
        mov     dx,protss               ; charge SS mode protégé 
        mov     bx,protsp               ; charge SP mode protégé 
        mov     si,protcs               ; charge CS mode protégé
        mov     di,protip               ; charge IP mode protégé 
	jmp	realrms

openfile endp