Transcript 11.Pile

Système d’exploitation :
Assembleur
Semaine 11
La pile
La pile (ou Stack) (1/8)
• Zone de mémoire utilisée comme zone de travail
– Sauvegarde temporaire d’information
(par exemple : contenu d’un registre, valeur des indicateurs, adresse, …)
– Utilisée par CALL (procédures), INT, ...
• Réservation de la pile à l’aide de la directive .STACK
(opérande: taille de la pile, en octets)
– Exemple : .STACK 100h
.STACK
(256 octets dans le Stack Segment)
(Pas d’opérande, réservation de 1 Ko)
• La pile fonctionne comme une pile d’assiettes :
– dernier entré, premier sorti.
(LIFO = Last In First Out)
– Attention : la pile fonctionne de haut en bas.
– Les informations sont donc stockées dans la mémoire de la partie haute vers la
partie basse (≠ data, ≠ code : de bas en haut).
La pile (ou Stack) (2/8)
• Registre pointeur associé au fonctionnement de la pile : SP
– (Stack Pointer = pointeur de pile)
– Au chargement du programme, il reçoit la taille de la pile
– Exemple : si .STACK 100h
alors SP = 0100
si .STACK
alors SP = 0400
– SP POINTE AU-DESSUS DE LA PILE !
• Registre de segment associé au fonctionnement de la pile : SS
– (Stack Segment = segment de pile)
– Au chargement du programme, il reçoit le n° de paragraphe de chargement de
la pile.
• Quelles opérations peut-on effectuer sur la pile ?
– déposer une donnée sur la pile : PUSH
– retirer une donnée sur la pile : POP
La pile (ou Stack) (3/8)
• Fonctionnement des instructions PUSH et POP
Attention : Les mots déposés sur la pile doivent être retirés en sens inverse !
A B B A
La pile (ou Stack) (4/8)
•
L’instruction PUSH
– Place une donnée de 2 octets sur le sommet de la pile
– Utilisation :
PUSH reg (16)
PUSH mem (16)
– Exemples :
PUSH AX
PUSH DS
PUSH ES:[3]
PUSH [3] (rappel : DS est le segment de données par défaut !)
– Fonctionnement :
SP est décrémenté de 2 et ensuite l’opérande source est placée dans le stack segment à
l’adresse effective contenue dans SP.
c’est-à-dire
sub SP,2
mov BP,SP
mov [BP], source où source est un registre ou une mémoire
La pile (ou Stack) (5/8)
•
L’instruction POP
– Va chercher dans la pile 2 octets au sommet de la pile
– Utilisation : POP reg (16)
POP mem (16)
– Exemples :
POP AX
POP DS
POP ES:[3]
POP [3] (rappel : DS est le segment de données par défaut !)
– Fonctionnement :
Le mot dans SS à l’adresse effective SP est transféré dans l’opérande destination et
ensuite SP est incrémenté de 2 .
c’est-à-dire
mov BP,SP
mov dest, [BP] où dest est un registre ou une mémoire
add SP,2
La pile (ou Stack) (6/8)
•
Exemple d’utilisation 1: inverser le contenu de AX et BX
push ax
mov ax, bx
pop bx
•
Exemple d’utilisation 2: calcul de la somme des 300 premiers entiers sans tableau
charge :
somme :
.model small
.stack 600
.code
mov bx,0
mov ax,1
mov cx,300
push ax
inc ax
loop charge
mov cx,300
pop ax
add bx,ax
loop somme
mov ah,4ch
int 21h
end
; bx reçoit la somme des 300 nombres
; chargement des 300 entiers dans la pile
; le résultat est dans bx
La pile (ou Stack) (7/8)
•
Exemple d’utilisation 3 :
sauvegarde de données quand
–
–
•
pas de registres disponibles
registre particulier utilisé
tab
remplissage d’un tableau de 5 lignes et 3
colonnes avec les 15 premiers entiers
(nb : utilisation de boucles imbriquées)
boucle_ext :
boucle_int :
end
.model small
.data
db 5 dup(3 dup(?))
;tableau de 5 lignes et 3 colonnes
.stack 2
.code
mov ax,@data
mov ds,ax
lea bx,tab
; ou mov bx,offset tab
mov al,1
mov cx,5
xor di,di
push cx
mov cx,3
mov [bx][di],al
inc al
inc di
loop boucle_int
pop cx
loop boucle_ext
mov ah,4ch
int 21h
La pile (ou Stack) (8/8)
• L’instruction PUSHF
– Empile le registre des indicateurs d’état.
– Les indicateurs d’état ne sont pas modifiés par l’opération.
– Utilisation : PUSHF (pas d’opérande)
• L’instruction POPF
– Retire le mot situé au sommet de la pile et le copie dans le
registre des indicateurs d’état.
– Les indicateurs sont tous affectés par cette opération.
– Utilisation : POPF (pas d’opérande)