Assembleur Z80 - Inspecter le Stack Pointer (SP)
Bonsoir à tous,
Cela faisait longtemps que je n'avais plus écrit d'article sur le Z80. Le dernier article général autour du RC2014 (Z80) date d'Octobre 2022.
Depuis, la rétro-ingénierie d'une centrale téléphonique à base de Z80 à pas mal occupé mes activités Z80.
Petit retour donc sur les bases de la programmation Z80.
Cette fois, nous allons nous concentrer sur la comparaison de valeurs.
A propos du Stack Pointer
Le registre SP contient l'adresse de la pile (Stack Pointer). Cette adresse pointe sur de dernier élément de la pile qui fonctionne en FiFo (First-in, First-out = premier-entré = premier-sorti).
Au démarrage du programme, le Stack Pointer est initialisé avec l'adresse de la fin de mémoire RAM car le stack pointer fonctionne à l'envers (c-à-d en diminuant l'adresse qu'il contient).
La pile permet mémoriser les adresses de retour (empilé lors d'un CALL et dépilé lors du RET).
La pile permet aussi d'empiler temporairement des données avec l'instruction PUSH, données qu'il faudra ensuite extraire -dans l'ordre- avec l'instruction POP.
Enfin, l'adresse dans le registre SP pointe toujours vers le dernier élément ajouté. Lors d'un PUSH (ou CALL), l'adresse est décrémenté avant de stocker la nouvelle donnée dans la pile.
SP: Inspecter la valeur du Stack Pointer
Récemment, j'ai eu besoin d'inspecter le contenu du registre SP.
S'il est très facile d'en initialiser la valeur (LD SP, 0x2300) , l'inverse n'est pas vrai!
Il faut ruser un peu pour obtenir l'adresse stockée dans le Stack Pointer (le registre SP n'est pas fait pour être lu).
Nous l'additionnons SP au registre HL (qui contient 0) puis nous pouvons récupérer séparément les 8 bits de poids faibles ou de poids fort.
ld hl, 0 add hl, sp ; low byte ld a, l ; Send low byte to LED display out (RCIO_OUTPUT), a ; high byte of SP ld a, h ; Send Hihg byte to LED display out (RCIO_OUTPUT), a
J'espère que vous trouvez cela interesant.
Cordialement,
Dominique
Écrire un commentaire