Jeu d'instructions Burroughs B6x00-7x00 - Burroughs B6x00-7x00 instruction set

Le jeu d'instructions Burroughs B6x00-7x00 comprend l'ensemble des opérations valides pour les grands systèmes Burroughs B6500, B7500 et versions ultérieures , y compris les systèmes Unisys Clearpath/MCP actuels (à partir de 2006) ; il n'inclut pas les instructions pour les autres grands systèmes Burroughs, notamment les B5000, B5500, B5700 et B8500. Ces machines uniques ont un design et un jeu d'instructions distinctifs. Chaque mot de données est associé à un type, et l'effet d'une opération sur ce mot peut dépendre du type. De plus, les machines sont basées sur une pile au point qu'elles n'avaient pas de registres adressables par l'utilisateur.

Aperçu

Comme on peut s'y attendre de l'architecture unique utilisée dans ces systèmes, ils ont également un jeu d'instructions intéressant . Les programmes sont composés de syllabes de 8 bits , qui peuvent être Appel de nom, Appel de valeur ou former un opérateur, qui peut avoir une longueur de une à douze syllabes. Il y a moins de 200 opérateurs , qui s'intègrent tous dans des syllabes de 8 bits. Si nous ignorons les puissants opérateurs de balayage, de transfert et d'édition de chaînes, l'ensemble de base n'est que d'environ 120 opérateurs. Si l'on supprime les opérateurs réservés au système d'exploitation tels que MVST et HALT, l'ensemble des opérateurs couramment utilisés par les programmes de niveau utilisateur est inférieur à 100. Les syllabes Name Call et Value Call contiennent des couples d'adresses ; les syllabes de l'opérateur n'utilisent aucune adresse ou utilisent des mots de contrôle et des descripteurs sur la pile.

Puisqu'il n'y a pas de registres adressables par le programmeur, la plupart des opérations de manipulation de registre requises dans d'autres architectures ne sont pas nécessaires, pas plus que des variantes pour effectuer des opérations entre des paires de registres , puisque toutes les opérations sont appliquées au sommet de la pile . Cela rend également les fichiers de code très compacts, car les opérateurs ont une adresse zéro et n'ont pas besoin d'inclure l'adresse des registres ou des emplacements mémoire dans le flux de code. Une partie de la densité du code était due au déplacement d'informations vitales sur les opérandes ailleurs, vers des « balises » sur chaque mot de données ou dans des tables de pointeurs. De nombreux opérateurs sont génériques ou polymorphes en fonction du type de données sur lesquelles agit la balise. Les opcodes génériques nécessitaient moins de bits d'opcode mais rendaient le matériel plus semblable à un interpréteur, avec moins d'opportunités de pipeliner les cas courants.

Par exemple, le jeu d'instructions n'a qu'un seul opérateur ADD. Il a dû récupérer l'opérande pour découvrir s'il s'agissait d'un ajout d'entier ou d'un ajout à virgule flottante. Les architectures typiques nécessitent plusieurs opérateurs pour chaque type de données, par exemple add.i, add.f, add.d, add.l pour les types de données entier, flottant, double et long. L'architecture ne distingue que les nombres à simple et double précision - les entiers ne sont que des réels avec un exposant nul . Lorsqu'un ou les deux opérandes ont une balise de 2, un ajout en double précision est effectué, sinon la balise 0 indique une simple précision. Ainsi, la balise elle-même est l'équivalent de l'extension d'opérateur .i, .f, .d et .l. Cela signifie également que le code et les données ne peuvent jamais être incompatibles.

Deux opérateurs sont importants dans le traitement des données sur la pile - VALC et NAMC. Ce sont des opérateurs à deux bits, 00 étant VALC, appel de valeur, et 01 étant NAMC, appel de nom. Les six bits suivants de la syllabe, concaténés avec la syllabe suivante, fournissent le couple d'adresses. Ainsi VALC couvre les valeurs syllabiques 0000 à 3FFF et NAMC 4000 à 7FFF.

VALC est un autre opérateur polymorphe. S'il atteint un mot de données, ce mot est chargé en haut de la pile . S'il atteint un IRW, celui-ci est suivi, éventuellement dans une chaîne d'IRW jusqu'à ce qu'un mot de données soit trouvé. Si un PCW est trouvé, une fonction est entrée pour calculer la valeur et le VALC ne se termine pas tant que la fonction ne revient pas.

Le NAMC charge simplement le couple d'adresses en haut de la pile en tant qu'IRW (avec la balise automatiquement définie sur 1).

Les branches statiques (BRUN, BRFL et BRTR) utilisaient deux syllabes supplémentaires de décalage. Ainsi, les opérations arithmétiques occupaient une syllabe, les opérations d'adressage (NAMC et VALC) en occupaient deux, les branches trois et les longs littéraux (LT48) cinq. En conséquence, le code était beaucoup plus dense (avait une meilleure entropie) qu'une architecture RISC conventionnelle dans laquelle chaque opération occupe quatre octets. Une meilleure densité de code signifiait moins d'échecs dans le cache d'instructions et donc de meilleures performances pour l'exécution de code à grande échelle.

Dans les explications d'opérateur suivantes, rappelez-vous que A et B sont les deux premiers registres de pile. Les extensions en double précision sont fournies par les registres X et Y ; ainsi les deux premiers opérandes en double précision sont donnés par AX et BY. (La plupart du temps, AX et BY sont implicites uniquement par A et B.)

B6x00/7x00 Couple d'adresses
LL actuel
Bits de niveau lexical

Bits d' indexation
0-1 13 12-0
2-3 13-12 11-0
4-7 13-11 10-0
8-15 13-10 9-0
16-31 13-9 8-0

Opérateurs arithmétiques

AJOUTER
Ajouter les deux premiers opérandes de la pile (B := B + A ou BY := BY + AX ​​si double précision)
SUBT
Soustraire (B - A)
MULT
Multiplier avec un résultat simple ou double précision
MULX
Multiplication étendue avec résultat forcé en double précision
DIVD
Diviser avec un résultat réel
IDIV
Diviser avec un résultat entier
RDIV
Renvoyer le reste après division
NTIA
Entier tronqué
NTGR
Intégrer arrondi
NTGD
Intégrer arrondi avec résultat double précision
CHSN
Changer de signe
REJOINDRE
Joindre deux célibataires pour former un double
SPLT
Diviser un double pour former deux simples
ICVD
Conversion d'entrée destructrice - convertit le nombre BCD en binaire (pour COBOL)
ICVU
Mise à jour de conversion d'entrée - convertit le numéro BCD en binaire (pour COBOL)
SNGL
Réglé sur simple précision arrondi
SNGT
Réglé sur simple précision tronqué
XTND
Réglé en double précision
PACD
Pack destructeur
PACU
Mise à jour des packs
USND
Déballer signé destructif
USNU
Décompresser la mise à jour signée
UABD
Déballez la destruction absolue
UABU
Déballez, mise à jour absolue
SXSN
Définir le signe externe
ROFF
Lire et effacer la bascule de débordement
RTFF
Lire la bascule vrai/faux

Opérateurs de comparaison

MOINS
Est-ce que B < A ?
GREQ
Est-ce que B >= A ?
RGTR
Est-ce que B > A ?
LSEQ
Est-ce que B <= A ?
ÉGAL
Est-ce que B = A ?
NEQL
Est-ce que B <> A ?
MÊME
B a-t-il le même modèle de bits que A, y compris l'étiquette

Opérateurs logiques

TERRE
Logique au niveau du bit et de tous les bits dans les opérandes
LOR
Logique au niveau du bit ou de tous les bits dans les opérandes
NON
Complément logique au niveau du bit de tous les bits de l'opérande
LEQV
Équivalence logique au niveau du bit de tous les bits des opérandes

Opérateurs de succursales et d'appels

BRUN
Branchement inconditionnel (décalage donné par les syllabes de code suivantes)
DBUN
Branchement dynamique inconditionnel (offset donné en haut de la pile)
BRFL
Branchement si dernier résultat faux (décalage donné par les syllabes de code suivantes)
DBFL
Branche dynamique si dernier résultat faux (offset donné en haut de la pile)
BRTR
Branche si dernier résultat vrai (décalage donné par les syllabes de code suivantes)
DBTR
Branche dynamique si dernier résultat vrai (décalage donné en haut de la pile)
SORTIR
Quitter l'environnement actuel (arrêter le processus)
STBR
Pas et branche (utilisés dans les boucles ; l'opérande doit être SIW)
ENTRÉE
Exécuter un appel de procédure tel que donné par une balise 7 PCW, résultant en un RCW à D[n] + 1
RET
Retour de la routine actuelle à la place donnée par RCW à D[n] + 1 et suppression du cadre de pile

Opérateurs de bits et de champs

BSET
Bit défini (numéro de bit donné par la syllabe qui suit l'instruction)
DBST
Jeu de bits dynamique (numéro de bit donné par le contenu de B)
BRST
Bit reset (numéro de bit donné par la syllabe suivante instruction)
DBRS
Remise à zéro dynamique des bits (numéro de bit donné par le contenu de B)
ISOL
Isolat de champ (champ donné en syllabes suivant les instructions)
DISSO
Isolat de champ dynamique (champ donné en haut des mots de la pile)
FLTR
Transfert de champ (champ donné en syllabes suivant instruction)
DFTR
Transfert de champ dynamique (champ donné en haut des mots de la pile)
INSR
Insertion de champ (champ donné en syllabes suivant l'instruction)
DIN
Insertion de champ dynamique (champ donné en haut des mots de la pile)
CBON
Compter les binaires en haut du mot de pile (A ou AX)
SCLF
Échelle à gauche
DSLF
Échelle dynamique à gauche
SCRT
Échelle à droite
DSRT
Échelle dynamique à droite
SCRS
Mettre à l'échelle à droite enregistrer
DSRS
Échelle dynamique à droite enregistrer
SCRF
Echelle finale à droite
DSRF
Echelle dynamique droite finale
SCRR
Échelle à droite
DSRR
Échelle dynamique à droite

Opérateurs littéraux

LT48
Charger le mot de code suivant en haut de la pile
LT16
Définir le haut de la pile sur les 16 bits suivants dans le flux de code
LT8
Définir le haut de la pile sur la syllabe de code suivante
ZÉRO
Raccourci pour LT48 0
UNE
Raccourci pour LT48 1

Opérateurs descripteurs

INDX
Index créer un pointeur (copier un descripteur) à partir d'un descripteur de base (MOM)
NXLN
Index et nom de charge (résultant en un descripteur indexé)
NXLV
Index et valeur de charge (résultant en une valeur de données)
ÉVAL
Évaluer le descripteur (suivre la chaîne d'adresses jusqu'à ce que le mot de données ou un autre descripteur soit trouvé)

Opérateurs de pile

POUSSER
Pousser le registre de pile vers le bas
DLET
Pop en haut de la pile
ÉCHANGE
Échangez les deux premiers mots de la pile
RSUP
Faire pivoter la pile vers le haut (trois premiers mots)
RSDN
Faire pivoter la pile vers le bas (trois premiers mots)
DUPL
Dupliquer le haut de la pile
MKST
Marquer la pile (construire un nouveau cadre de pile résultant en un MSCW sur le dessus,

- suivi de NAMC pour charger le PCW, puis de paramètres poussés au besoin, puis ENTR)

IMKS
Insérez un MSCW dans le registre B.
VALC
Récupérer une valeur sur la pile comme décrit ci-dessus
NAMC
Placez un couple d'adresses (adresse de pile IRW) sur la pile comme décrit ci-dessus
STFF
Convertissez un IRW tel qu'il est placé par NAMC en un SIRW qui référence les données dans une autre pile.
MVST
Déplacer vers la pile (la commutation de processus n'est effectuée qu'à un seul endroit dans le MCP)

Exploitants de magasins

STOD
Destructeur de stockage (si le mot cible a une balise impaire, lancez une interruption de protection de la mémoire,

— mémoriser la valeur dans le registre B dans la mémoire adressée par le registre A. — Supprimez la valeur de la pile.

STON
Stockage non destructif (Identique à STOD mais la valeur n'est pas supprimée - pratique pour les expressions F := G := H := J).
OVRD
Écrasement destructif, STOD ignorant le bit en lecture seule (pour une utilisation dans MCP uniquement)
OVRN
Écraser non destructif, STON ignorant le bit en lecture seule (pour une utilisation dans MCP uniquement)

Opérateurs de charge

L'instruction Load pourrait se retrouver à déclencher sur une adresse indirecte , ou pire, un appel déguisé à une routine thunk d' appel par nom .

CHARGE
Chargez la valeur donnée par l'adresse (tag 5 ou tag 1 mot) en haut de la pile.

— Suivez une chaîne d'adresses si nécessaire.

LODT
Charger transparent - charge le mot référencé par l'adresse en haut de la pile

Opérateurs de transfert

Ceux-ci étaient généralement utilisés pour les transferts de chaînes jusqu'à ce qu'un certain caractère soit détecté dans la chaîne source. Tous ces opérateurs sont protégés des débordements de buffer en étant limités par les bornes des descripteurs.

TWFD
Transfert alors que faux, destructeur (oublier le pointeur)
TWFU
Transfert alors que faux, mise à jour (laisser le pointeur à la fin du transfert pour d'autres transferts)
TWTD
Transfert tout en vrai, destructeur
TUT
Transférer si vrai, mettre à jour
TWSD
Mots de transfert, destructeurs
TWSU
Mots de transfert, mise à jour
DEUX
Transférer des mots, écraser destructif
DEUX
Transférer des mots, écraser la mise à jour
TRNS
Translate - transfère un tampon source dans une destination en convertissant les caractères comme indiqué dans une table de traduction.
TLSD
Transfert en moins, destructeur
TLSU
Transférez en moins, mettez à jour
TGED
Transfert tout supérieur ou égal, destructeur
TGUE
Transfert tout supérieur ou égal, mise à jour
TGTD
Transfert tout en étant plus grand, destructeur
TGTU
Transférer en plus grand, mettre à jour
TLED
Transfert tout inférieur ou égal, destructeur
TLEU
Transfert inférieur ou égal, mise à jour
TEQD
Transfert tout égal, destructeur
TEQU
Transfert à égalité, mise à jour
TNED
Transfert tout en n'étant pas égal, destructeur
TNEU
Transfert sans égalité, mise à jour
TUND
Transfert inconditionnel, destructeur
TUNU
Transfert inconditionnel, mise à jour

Opérateurs de numérisation

Ceux-ci ont été utilisés pour analyser les chaînes utiles dans l'écriture des compilateurs . Tous ces opérateurs sont protégés des débordements de buffer en étant limités par les bornes des descripteurs.

SWFD
Scan tout faux, destructeur
SISO
Isolat de chaîne
SWTD
Scan tout vrai, destructeur
SWTU
Analyser si vrai, mettre à jour
SLSD
Scannez en moins, destructeur
SLSU
Scannez en moins, mettez à jour
SGED
Scan tout en étant supérieur ou égal, destructeur
SGEU
Analyser tout en étant supérieur ou égal, mettre à jour
SGTD
Scan tout en étant plus grand, destructeur
SGTU
Scannez plus longtemps, mettez à jour
TRAÎNEAU
Numérisez tout en étant inférieur ou égal, destructeur
SLEU
Scannez tout inférieur ou égal, mettez à jour
SEQD
Scan tout égal, destructeur
SEQU
Scan à égalité, mise à jour
SNED
Scannez sans être égal, destructeur
SNEU
Analyser tout en étant différent, mettre à jour
CLSD
Comparer les personnages moins, destructeur
CLSU
Comparez moins les caractères, mettez à jour
CGED
Comparer des caractères supérieurs ou égaux, destructeurs
CGEU
Comparer des caractères supérieurs ou égaux, mettre à jour
CGTD
Comparer le caractère plus grand, destructeur
CGTU
Comparer le caractère supérieur, mettre à jour
CLED
Comparer des caractères inférieurs ou égaux, destructeurs
CLEU
Comparer les caractères inférieurs ou égaux, mettre à jour
CEQD
Comparer le caractère égal, destructeur
CEQU
Comparer le caractère égal, mettre à jour
CNED
Comparer des caractères différents, destructeurs
CNEU
Comparer des caractères différents, mettre à jour

Système

SINT
Régler la minuterie d'intervalle
EEXI
Activer les interruptions externes
DEXI
Désactiver les interruptions externes
SCNI
Scan in - initier la lecture IO, cela a changé sur différentes architectures
SCNO
Scan out - initier l'écriture IO, cela a changé sur différentes architectures
CERF
Définir la balise (non autorisé dans les processus au niveau de l'utilisateur)
RTAG
Lire la balise
IRWL
Pseudo opérateur matériel
SPRR
Définir le registre du processeur (très dépendant de la mise en œuvre, utilisé uniquement dans les niveaux inférieurs de MCP)
RPRR
Lire le registre du processeur (très dépendant de la mise en œuvre, utilisé uniquement dans les niveaux inférieurs de MCP)
MPCW
Faire PCW
ARRÊT
Arrêtez le processeur (l'opérateur a demandé ou une condition irrécupérable s'est produite)

Autre

VARI
Escape to étendu (instructions variables qui étaient moins fréquentes)
OCRX
L'index Occurs crée un mot d'index Occurs utilisé dans les boucles
LLLU
Recherche de liste liée - Suivez une chaîne de mots liés jusqu'à ce qu'une certaine condition soit remplie
SRCH
Recherche masquée d'égalité - Similaire à LLLU, mais testant un masque dans les mots examinés pour une valeur égale
TEED
Tableau entrer modifier destructif
TEEU
Tableau entrer éditer, mettre à jour
EXSD
Exécuter un seul micro-destructeur
EXSU
Exécuter une seule micro-mise à jour
EXPU
Exécuter la mise à jour d'un seul micro, pointeur unique
NOOP
Pas d'opération
NVLD
Opérateur non valide (code hexadécimal FF)
Opérateurs utilisateurs
les opérateurs non affectés pourraient provoquer des interruptions dans le système d'exploitation afin que des algorithmes puissent être écrits pour fournir la fonctionnalité requise

Modifier les opérateurs

Il s'agissait d'opérateurs spéciaux pour la manipulation sophistiquée des chaînes, en particulier pour les applications commerciales.

MIN
Déplacer avec insertion - insérer des caractères dans une chaîne
MFLT
Déplacer avec flotteur
SFSC
Avancer le caractère source
SRSC
Ignorer les caractères source inversés
RSTF
Réinitialiser le flotteur
ENDF
Flotteur d'extrémité
MVNU
Déplacer le numérique inconditionnel
MCHR
Déplacer des personnages
INOP
Insertion de surperforation
INSG
Insérer un signe
SFDC
Avancer le caractère de destination
SRSA
Ignorer les caractères de destination inversés
INSU
Insérer inconditionnel
INSC
Insérer conditionnel
FIN
Terminer la modification

Remarques

Les références