Apprentissage des codes du langage machine

Prenons comme exemple le programme suivant:

;
; Apprentissage des codes du langage machine
;
; ce programme affiche un nombre entré * 2 + 15
;

         STRO    demande,d   ; nombre demandé
         DECI    nombre,d    
         LDA     nombre,d    ; nombre  
         ASLA                ; *2  
         ADDA    15,i        ; +15  
         STA     résultat,d  
         STRO    message,d   ; nouveau nombre calculé  
         DECO    résultat,d  
         STOP                
nombre:  .BLOCK  2           ; #2h
résultat:.WORD   10          ; #2h  
demande: .ASCII  "Entrez un nombre: \x00"
message: .ASCII  "\nLe nombre lu*2+15 donne: \x00"
         .END                  
Le compilateur PEP8 procède ligne par ligne:
Il compile en 2 passes.
Lors de la première passe, il ne pourra pas finaliser le code-machine
car l'adresse des symboles (les variables) n'est pas encore connue.
Lors de la deuxième passe, il pourra alors finaliser le code-machine
car les adresses de toutes les variables seront connues.
;
; Apprentissage des codes du langage machine
;
; ce programme affiche un nombre entré * 2 + 15
;

Quand le caractère ";" est rencontré, les caractères qui suivent ";" sont oubliés.
Une ligne blanche est oubliée.


         STRO    demande,d   ; nombre demandé

Selon l'annexe C (39 instructions de PEP8):

01000aaa STRO Interruption de sortie de chaîne        d,n,sf

le code d'instruction est 010002

aaa est l'un des 8 modes d'adressages: (i,d,n,s,sf,x,sx,sxf)

000 Immédiat
001 Direct
010 Indirect
011 Pile (Stack)
100 Pile indirect (SF)
101 IndeXé
110 Indexé pile (SX)
111 Indexé pile indirect (SXF)

Pour l'instruction STRO, les seuls modes d'adressage possibles sont: d,n,sf

STRO xxxxxxxx,d

010000012 -> 4116

Les instructions de PEP8 occupent 1 ou 3 octets.
Généralement c'est 3 octets si elles sont suivies de paramètres.

Comme la variable "demande" n'est pas encore connue à ce stade,
nous utiliserons 0000 comme adresse temporaire.

donc le code-machine généré sera: 410000

La compilation s'effectue en 2 passes.
Lors de la première passe, l'adresse des variables est initialisée à 0000.
Lors de la deuxième passe, l'adresse des variables sera remplacée par son adresse réelle.


         DECI    nombre,d   

Selon l'annexe C:

00110aaa DECI Interruption d’entrée décimale        d,n,s,sf,x,sx,sxf      NZV

Pour l'instruction DECI, les seuls modes d'adressage possibles sont: d,n,s,sf,x,sx,sxf

Les codes de condition affectés sont N-négativité, Z-zéro, V-oVerflow
Le code de condition
C-carry n'est pas affecté.

DECI xxxxxxxx,d

001100012 -> 3116

donc le code-machine généré sera: 310000


         LDA     nombre,d    ; nombre 

Selon l'annexe C:

1100raaa LDr Placer 1 mot dans registre               i,d,n,s,sf,x,sx,sxf    NZ

Pour l'instruction LDr, les 8 modes d'adressage sont possibles.

r: registre (registre A: 0 ou registre X: 1)

Les codes de condition affectés sont N-négativité, Z-zéro

LDA xxxxxxxx,d

110000012 -> C116

donc le code-machine généré sera: C10000


         ASLA                ; *2 

Selon l'annexe C:

0001110r ASLr Décalage arithmétique à gauche du registre                     NZVC

Pour l'instruction ASLr, il n'y a pas de mode d'adressage; c'est une instruction d'un seul octet.

r: registre (registre A: 0 ou registre X: 1)

Tous les codes de condition sont affectés: NZVC

ASLA

000111002 -> 1C16

 

         ADDA    15,i         ; +15 

Selon l'annexe C:

0111raaa ADDr Addition au registre                     i,d,n,s,sf,x,sx,sxf   NZVC

Pour l'instruction ADDr, les 8 modes d'adressage sont possibles.

r: registre (registre A: 0 ou registre X: 1)

Tous les codes de condition sont affectés: NZVC

ADDA xxxxxxxx,i

011100002 -> 7016

000F(1510) est l'immédiat

donc le code-machine généré sera: 70000F


         STA     résultat,d 

Selon l'annexe C:

1110raaa STr Ranger registre dans 1 mot                        d,n,s,sf,x,sx,sxf

Pour l'instruction STr, seul le mode i n'est pas possible.

r: registre (registre A: 0 ou registre X: 1)

Les codes de condition ne sont pas affectés.

STA xxxxxxxx,d

111000012 -> E116

donc le code-machine généré sera: E10000
 


         STRO    message,d   ; nouveau nombre calculé 

Selon l'annexe C:

01000aaa STRO Interruption de sortie de chaîne                   d,n,sf

le code d'instruction est 01000

Pour l'instruction STRO, les seuls modes d'adressage possibles sont: d,n,sf

STRO xxxxxxxx,d

0100000012 -> 4116

donc le code-machine généré sera: 410000
 


         DECO    résultat,d 

Selon l'annexe C:

00111aaa DECO Interruption de sortie décimale                    i,d,n,s,sf,x,sx,sxf

le code d'instruction est 00111

Pour l'instruction DECO, tous les modes d'adressage sont possibles.

DECO xxxxxxxx,d

001110012 -> 3916

donc le code-machine généré sera: 390000



         STOP               

Selon l'annexe C:

00000000 STOP Arrête l’exécution du programme

le code d'instruction est 00000000

Pour l'instruction STOP, il n'y a pas de mode d'adressage; c'est une instruction d'un seul octet.

STOP

000000002 -> 0016

donc le code-machine généré sera: 00
 


nombre:  .BLOCK  2           ; #2h

La directive .BLOCK 2 réserve 2 octets.

donc le code-machine généré sera: 0000
 

 
résultat:.WORD  10           ; #2h 

La directive .WORD réserve 2 octets initialisés à 0A.

donc le code-machine généré sera: 000A



demande: .ASCII  "Entrez un nombre: \x00"

La directive .ASCII réserve 1 octet par caractère fourni,
caractère qui est initialisé.

donc le code-machine généré sera: 456E7472657A20756E206E6F6D6272653A2000



message: .ASCII  "\nLe nombre lu*2+15 donne: \x00"

La directive .ASCII réserve 1 octet par caractère fourni,
caractère qui est initialisé.

donc le code-machine généré sera: 0A4C65206E6F6D627265206C752A322B313520646F6E656E3A2000



         .END

La directive .END indique la fin du programme.

 

La première passe est terminée.

Lors de cette première passe, une table des symboles a été crée
contenant les adresses des variables.

--------------------------------------
Symbol    Value        Symbol    Value
--------------------------------------
demande   001B         message   002E
nombre    0017         résultat  0019
--------------------------------------

2ième passe:
Il faut maintenant finaliser chacune des instructions avec l'adresse de chaque variable:
         STRO    demande,d   ; nombre demandé
410000 -> 41001B
         DECI    nombre,d    
310000 -> 310017
         LDA     nombre,d    ; nombre  
C10000 -> C10017
         ASLA                ; *2  
1C -> 1C
         ADDA    15,i        ; +15  
70000F -> 70000F
         STA     résultat,d  
E10000 -> E10019
         STRO    message,d   ; nouveau nombre calculé 
410000 ->

41002E
         DECO    résultat,d  
390000 -> 390019
         STOP                
00 -> 00
nombre:  .BLOCK  2           ; #2h
0000 -> 0000
résultat:.WORD   10          ; #2h  
000A -> 000A
demande: .ASCII  "Entrez un nombre: \x00"
456E7472657A2075
6E206E6F6D627265
3A2000
-> 456E7472657A2075
6E206E6F6D627265
3A2000
message: .ASCII  "\nLe nombre lu*2+5 donne: \x00"
0A4C65206E6F6D62
7265206C752A322B
313520646F6E656E
3A2000
-> 0A4C65206E6F6D62
7265206C752A322B
313520646F6E656E
3A2000
         .END 
. .-> .
 
Maintenant le code-machine final est:
41 00 1B 31 00 17 C1 00 17 1C 70 00 0F E1 00 19
41 00 2E 39 00 19 00 00 00 00 00 45 6E 74 72 65
7A 20 75 6E 20 6E 6F 6D 62 72 65 3A 20 00 0A 4C
65 20 6E 6F 6D 62 72 65 20 6C 75 2A 32 2B 31 35
20 64 6F 6E 65 6E 3A 20 00 

(sans les espaces séparateurs)