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
où 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)