Ensuite pour le reste de ta question, l'idée schématique de CHIP8 c'est ça :
T'as un clavier
T'as un écran
T'as un timer
T'as de la RAM (la mémoire)
T'as différentes registres (V0, ..., VF pour stocker des bytes, I pour stocker des adresses, et des registres décrémentés automatiquement à une certaine fréquence par le timer)
T'as une stack de 16 adresses
Un CPU qui orchestre le tout
Lorsque tu "lances" le CHIP8 le CPU va commencer par lire deux bytes en 0x200, ces deux bytes vont correspondre à une instruction élémentaire. Par exemple 0x00e0 (CLS) c'est une instruction qui va remettre à zéro l'écran. Donc le CPU va lire ces deux premiers bytes, exécuter l'instruction correspondante puis passer aux deux prochains bytes etc.
Il faut t'imaginer une sorte de curseur qui pointe vers l'instruction en train d'être traitée, et à chaque fois ce curseur est décalé de deux bytes après avoir lu l'instruction.
Ce curseur on peut le représenter par l'adresse de l'instruction et on l'appelle program counter (PC). Autrement dit, au début PC = 0x200 puis après avoir lu la première instruction PC = 0x202 etc.
Il y a certaines instructions qui modifient directement PC, par exemple JP addr permet de définir la valeur de PC explicitement.
Le programme JP 0x200 consiste donc en une boucle infinie puisque le CPU va lire l'instruction avec PC=0x200 puis va incrémenter PC=0x202 puis va exécuter l'instruction PC=0x200, etc. en boucle.
La stack c'est une forme de mémoire comme les registres mais avec plus de "structure", en l'occurrence une structure de pile. Tu vas pouvoir stocker une information en haut de la pile ou récupérer l'information en haut de la pile dans ton CPU.
L'intérêt fondamental de la stack dans le CHIP8 c'est de servir de call stack, c'est-à-dire de mémoriser les valeurs de PC pour pouvoir continuer l'exécution où on l'a interrompue précédemment si nécessaire.
Tout ça c'est lié au concept de procédure. Une procédure c'est un petit bout de code vers lequel on va sauter pour effectuer une certaine opération. Le problème c'est qu'on a besoin de revenir où on était avant d'avoir fait l'appel à la procédure une fois qu'elle a fini de s'exécuter, pour ça on doit stocker la valeur de PC avant d'effectuer le saut. On va donc pousser cette valeur sur la stack et quand la procédure aura terminé on récupérera la valeur en haut de la stack et on y sautera.
L'idée d'avoir une stack et pas juste un registre pour ça c'est que ça permet d'avoir des procédures imbriquées. Tu peux imaginer appeler PROC2 depuis PROC1.
Le rôle du stack pointer dans tout ça c'est simplement de désigner le haut de la pile. En incrémentant le stack pointer on "monte" dans la pile et en décrémentant on "descend" dans la pile.