ASMtrad CPC

Apprenez l'assembleur Z80

Stockage du code en RAM et Auto-modification.

Avant de faire votre premier scroll texte, il nous reste à voir les auto-modifications.
Pour cela, il vous faudra comprendre comment votre code est stocké en RAM.

1 - Stockage en RAM:

Reprenons notre code précédent:

                                ORG         #8000
                                LD          HL,LETEXTE      
                                LD          A,(HL)
                                SUB         32
                                LD          L,A
                                LD          H,0
                                ADD         HL,HL
                                ADD         HL,HL
                                ADD         HL,HL
                                ADD         HL,HL
                                ADD         HL,HL
                                ADD         HL,HL
                                LD          DE,#4000
                                ADD         HL,DE
                                RET

                LETEXTE         DEFM    "HELLO WORLD"

Assemblons notre code et allons voir en RAM en #8000 ce qu'on y trouve:

code desassemblé

On trouve donc à partir de #8000 plusieurs octets.

Le premier est un #21
#21 correspond en fait à l'instruction LD HL,val16

Les deux octets qui suivent, correspondent à val16, soit, l'adresse de LETEXTE en inversé, soit #8014

Ensuite nous avons #7E. #7E correspond au LD A,(HL).
Et ainsi de suite.

Les instructions sont donc stockées les unes à la suite des autres, à partir de l'adresse de notre ORG.

Cela signifie donc que chaque instruction a une adresse !!! Et que notre code prends aussi de la place...

Mais réfléchissez. Si on connait l'adresse d'une instruction en RAM on peut aussi la modifier !!!

2 - Auto-modification:

L'auto-modification c'est justement modifier le code que l'on a en RAM. L'utilisation peut par exemple d'être de gérer un compteur.

Imaginons un compteur sur A.

                                ORG         #8000
                COMPTEUR        LD          A,#15

Si nous regardons en RAM, LD A,val est stocké comme: #3E,#15#3E signifie: LD A, et #15 est notre valeur.

Le label "COMPTEUR" correspond à l'adresse en RAM ou est stockée l'instruction LD A,#15

Si nous voulons modifier la valeur de A, nous pouvons donc faire un:

                                LD          A,#16
                                LD          (Compteur+1),A

+1 car nous voulons modifier l'octet après le #3E !!!

Exemple de compteur avec décrémentation de A:
Decrémenter c'est faire -1 sur une valeur. Ici en l'occurence la valeur contenue dans le registre A.

                                LD          A,12
                                DEC         A

A vaudra 11. Simple non ?

Maintenant, nous pouvons modifier la valeur de A:

                COMPTEUR        LD          A,12
                                DEC         A
                                LD          (COMPTEUR+1),A      ;compteur+1 est bien une adresse puisque c'est entre parenthèse

On peut alors ajouter une condition pour faire boucler notre compteur...

                COMPTEUR        LD          A,12
                                DEC         A
                                LD          (COMPTEUR+1),A
                                CP          0
                                JP          NZ,machin
                                LD          A,12
                                LD          (COMPTEUR+1),A

Voyons en détail:

-Nous mettons 12 dans A.
-On le décrémente
-On auto-modifie A
-CP val c'est une instruction de ComParaison: on compare le contenu de A avec la valeur que l'on donne: ici 0.
Les flags sont alors mis à jour. Si A est égal à la valeur donnée, alors le flag Z est mis.
-JP NZ,machin: on saute à l'adresse "machin" si le flag Zéro n'est pas mis... En gros si A n'est pas egal à 0, alors on saute à l'adresse machin.
-Si le flag Z a été mis on ne saute donc pas... A=0... Et on continue avec ce qui est marqué à la suite.
-Puisque A=0, on va le remettre à sa valeur d'origine, à savoir: 12, ce qu'on fait avec le LD A,12.
-On auto-modifie le compteur pour le remettre à 12.

Vous voyez l'intéret ?

Notez en revanche que cela prend pas mal de temps machine de faire des auto-modifications.
Un LD (ADR),a prend quand même 4 NOPs.