Introduction
Le PCode est souvent considéré comme une des références à la fois les plus simples et les plus complètes en termes de code machine indépendant. Il a été créé dans les années 1970 par Niklaus Wirth pour les compilateurs en langage de programmation Pascal.
Ensemble d'instruction du PCode (P-Code)
Le P-Code repose sur des instructions similaires au langage assembleur, avec cependant une certaines simplifications et un moins grandes nombres d'instructions que l'assembleur dédié à un microprocesseur précis. Voici la liste des P-Code proposé par Niklaus Wirth :
Instruction | Opération dans la pile | Paramètres si présent | Description | |
---|---|---|---|---|
Avant | Après | |||
ABI | (i) | i | Cette instruction permet de mettre la valeur absolue de l'entier | |
ABR | (r) | r | Cette instruction permet de mettre la valeur absolue d'un réel | |
ADI | (i,i) | i | Cette instruction permet d'ajouter deux entiers dans le haut de la pile et laisse un nombre entier comme résultat. | |
ADR | (r,r) | r | Cette instruction permet d'ajouter deux réels dans le haut de la pile et laisse un nombre réel comme résultat. | |
CHKc | Pas de changement | PQ | Cette instruction permet de vérifier que la valeur est entre les limites hautes et basses. | |
CHR | (i) | c | Cette instruction permet de convertir un entier en caractère. | |
CSP | Spécial | Q | Cette instruction permet d'appeler une procédure standard. | |
CUP | Spécial | PQ | Cette instruction permet d'appeler une procédure utilisateur. | |
DECc | (x) | x | Q | Cette instruction permet de décrémenté une valeur |
DIF | (s, s) | s | Cette instruction permet de fixer la différence, | |
DVI | (i,i) | i | Cette instruction permet d'effectuer la division d'un nombre entier. | |
DVR | (r,r) | r | Cette instruction permet d'effectuer une division d'un nombre réel. | |
ENT | Spécial | PQ | Cette instruction permet d'entrer un bloc | |
EOF | (a) | b | Cette instruction permet de tester à la fin du fichier. | |
EQUc | (x,x) | b | Q | Cette instruction permet d'effectuer une comparaison d'égalité. |
FJP | (b) | Cette instruction permet d'effectuer un branchement à adresse si la condition est fausse. | ||
FLO | (i,r) | r,r | Cette instruction permet de rechercher le prochain réel dans le haut. | |
FLT | (i) | r | Cette instruction permet de mettre un nombre réel dans le haut de la pile. | |
GEQc | (x,x) | b | Q | Cette instruction permet de comparer une condition supérieur ou égale. |
INCc | (x) | x | Q | Cette instruction permet d'incrémenter une valeur |
INDc | (a) | x | Q | Cette instruction permet d'aller chercher un index. |
INN | (i,s) | b | Cette instruction permet de tester un ensemble d'adhésion. | |
INT | (s,s) | s | Cette instruction permet de fixer une intersection. | |
IOR | (b,b) | b | Cette instruction permet d'effectuer une opération booléenne «Ou inclusif». | |
IXA | (a,i) | a | Q | Cette instruction permet de calculer l'adresse d'index. |
LAO | a | Q | Cette instruction permet de charger le niveau d'adresse de base. | |
LCA | a | Q | Cette instruction permet de charger l'adresse de la constante. | |
LCI | x | PQ | Cette instruction permet de charger une constante indirecte. Génération assembleur. | |
LDA | a | PQ | Cette instruction permet de charger l'adresse avec le niveau P. | |
LDCc | x | Q | Cette instruction permet de charger une constante. | |
LDOc | x | Q | Cette instruction permet de charger le contenu d'un niveau d'adresse de base. | |
LEQc | (x,x) | b | Q | Cette instruction permet d'effectuer une comparaison inférieur ou égale. |
LESc | (x,x) | b | Q | Cette instruction permet d'effectuer une comparaison inférieur. |
LODc | x | PQ | Cette instruction permet de charger le contenu d'une adresse. | |
MOD | (i,i) | i | Cette instruction permet d'effectuer un restant de division. | |
MOV | (a,a) | Q | Cette instruction permet de copier une valeur d'un emplacement vers un autre. | |
MPI | (i,i) | i | Cette instruction permet d'effectuer une multiplication de nombre entier. | |
MPR | (r,r) | r | Cette instruction permet d'effectuer un multiplication de nombre réel. | |
MST | Spécial | P | Cette instruction permet de marquer la pile. | |
NEQc | (x,x) | b | Q | Cette instruction permet d'effectuer une comparaison de n'étant pas égale. |
NGI | (i) | i | Cette instruction permet d'effectuer une inversion des signes d'un nombre entier. | |
NGR | (r) | r | Cette instruction permet d'effectuer une inversion des signes d'un nombre réel. | |
NOT | (b) | b | Cette instruction permet d'effectuer une négation booléenne. | |
ODD | (i) | b | Cette instruction permet d'effectuer un test si impaire. | |
ORDc | (x) | i | Cette instruction permet de convertir en nombre entier. | |
RETc | Spécial | Cette instruction permet de retourner un bloc. | ||
SBI | (i,i) | i | Cette instruction permet de soustraire un nombre entier. | |
SBR | (r,r) | r | Cette instruction permet de soustraire un nombre réel. | |
SGS | (i) | s | Cette instruction permet de générer un ensemble simple. | |
SQI | (i) | i | Cette instruction permet d'effectuer la racine d'un nombre entier. | |
SQR | (r) | r | Cette instruction permet d'effectuer la racine d'un nombre réel. | |
SROc | (x) | Q | Cette instruction permet d'entreposer l'adresse à un niveau de base. | |
STOc | (a,x) | Cette instruction permet d'entreposer à un niveau de base l'adresse. | ||
STP | Pas d'effet | Cette instruction permet de fixer un point d'arrêt. | ||
STRc | (x) | PQ | Cette instruction permet d'entreposer au niveau P. | |
TRC | (r) | i | Cette instruction permet de tronquer un nombre réel. | |
UJC | Pas d'effet | Cette instruction permet d'indiquer une erreur dans l'instruction d'évaluation de cas. | ||
UJP | Pas d'effet | Q | Cette instruction permet d'effectuer un branchement inconditionnelle à une adresse. | |
UNI | (s, s) | s | Cette instruction permet d'effectuer une union. | |
XJP | (i) | Q | Cette instruction permet d'effectuer un branchement à un index. |
Liste des effets des clefs dans la pile :
Code | Description |
---|---|
a | Adresse |
b | Booléen |
c | Caractère |
i | Entier |
r | Réel |
s | Ensemble |
x | N'importe quel type de données |
Dernière mise à jour : Samedi, le 1er octobre 2016