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)