Recherche…


Remarques

La pile d'ordinateurs est comme une pile de livres. PUSH ajoute l'un au sommet et POP prend le plus haut. Comme dans la vraie vie, la pile ne peut pas être sans fin, elle a donc une taille maximale. La pile peut être utilisée pour trier des algorithmes, gérer une plus grande quantité de données ou des valeurs sûres de registres lors d'une autre opération.

Zilog Z80 Stack

Le registre sp est utilisé comme pointeur de pile , pointant vers la dernière valeur stockée dans la pile ("top" de la pile). Donc EX (sp),hl échangera la valeur de hl avec la valeur en haut de la pile.

Contrairement à ce mot « top », la pile grandit dans la mémoire en diminuant la sp , et libère ( « POP ») en augmentant les valeurs sp .

Pour sp = $4844 avec les valeurs 1 , 2 , 3 stockées sur la pile (le 3 étant poussé sur la pile comme dernière valeur, donc en haut), la mémoire ressemblera à ceci:

|    address | value bytes | comment (btw, all numbers are in hexadecimal)
| ---------- | ----------- | ---------------------------------
|       4840 | ?? ??       | free stack spaces to be used by next push/call
|       4842 | ?? ??       | or by interrupt call! (don't expect values to stay here)
| sp -> 4844 | 03 00       | 16 bit value "3" on top of stack
|       4846 | 02 00       | 16 bit value "2"
|       4848 | 01 00       | 16 bit value "1"
|       484A | ?? ??       | Other values in stack (up to it's origin)
|       484C | ?? ??       | like for example return address for RET instruction

Exemples, comment les instructions fonctionnent avec la pile:

    LD   hl,$0506
    EX   (sp),hl           ; $0003 into hl, "06 05" bytes at $4844
    POP  bc                ; like: LD c,(sp); INC sp; LD b,(sp); INC sp
                           ; so bc is now $0506, and sp is $4846
    XOR  a                 ; a = 0, sets zero and parity flags
    PUSH af                ; like: DEC sp; LD (sp),a; DEC sp; LD (sp),f
                           ; so at $4844 is $0044 (44 = z+p flags), sp is $4844
    CALL $8000             ; sp is $4842, with address of next ins at top of stack
                           ; pc = $8000 (jumping to sub-routine)
                           ; after RET will return here, the sp will be $4844 again
    LD   (L1+1),sp         ; stores current sp into LD sp,nn instruction (self modification)
    DEC  sp                ; sp is $4843
L1  LD   sp,$1234          ; restores sp to $4844 ($1234 was modified)
    POP  de                ; de = $0044, sp = $4846
    POP  ix                ; ix = $0002, sp = $4848
    ...

    ...
    ORG  $8000
    RET                    ; LD pc,(sp); INC sp; INC sp
                           ; jumps to address at top of stack, "returning" to caller

Résumé : PUSH stockera la valeur en haut de la pile, POP récupérera la valeur en haut de la pile, c'est une file d'attente LIFO (dernier entré , premier sorti). CALL est identique à JP , mais pousse également l'adresse de la prochaine instruction après CALL en haut de la pile. RET est similaire à JP , en sautant l'adresse de la pile et en y sautant.

Attention: lorsque les interruptions sont activées, le sp doit être valide pendant signal d' interruption, avec assez d' espace libre réservé à la routine de gestionnaire d' interruption, comme le signal d'interruption stockera l'adresse de retour (réelle pc ) avant d' appeler la routine de gestionnaire, qui peut stocker des données supplémentaires sur empiler aussi bien. Toute valeur en avance sur sp peut donc être modifiée "de manière inattendue" si une interruption se produit.

Trick avancé: le Z80 avec PUSH prenant 11 cycles d'horloge (11t) et POP prenant 10t, le déroula POP / PUSH creux tous les registres, y compris EXX pour des variantes d'ombre, était le meilleur moyen de copier bloc de mémoire, encore plus vite que déroulé LDI . Mais vous devez chronométrer la copie entre les signaux d'interruption pour éviter la corruption de la mémoire. De même, PUSH déroulé était le moyen le plus rapide de remplir la mémoire avec une valeur particulière sur ZX Spectrum (à nouveau avec le risque de corruption par interruption, si ce n'était pas chronométré correctement, ou sous DI ).



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow