Directives assembleur
Les directives d'assembleur sont utilisées pour définir des étiquettes sur des valeurs spécifiques pendant l'assemblage, effectuer un assemblage conditionnel, définir des zones d'entreposage et spécifier des adresses de départ dans le programme. Chaque directive assembleur est désignée par une «pseudo opération» apparaissant dans le champ opération de la ligne. Les pseudo-opérations acceptables sont présentées dans le tableau suivant :
Directive | Description |
---|---|
ORG | Défini l'origine du programme ou des données |
END | Programme de fin, adresse de début facultative |
EQU | Égalité numérique |
SET | Ensemble numérique |
IF | Commencer l'assemblage conditionnel |
ENDIF | Fin d'assemblage conditionnel |
DB | Définir les octets de données |
DW | Définir des mots de données |
DS | Définir la zone d'entreposage des données |
Les pseudo-opérations individuelles sont détaillées ci-dessous.
La directive ORG
L'instruction ORG prend le format suivant :
label ORG expression |
où label est une étiquette de programme facultative et expression est une expression 16 bits, composée d'opérandes définis avant l'instruction ORG. L'assembleur commence la génération du code machine à l'emplacement spécifié dans l'expression. Il peut y avoir n'importe quel nombre d'instructions ORG dans un programme particulier, et il n'y a aucune vérification pour s'assurer que le programmeur ne définit pas de zones de mémoire se chevauchant. Notez que la plupart des programmes écrits pour le système CP/M commencent par une instruction ORG de le format suivant :
- ORG 100H
ce qui provoque le démarrage de la génération du code machine à la base de la zone de programme transitoire CP/M. Si une étiquette est spécifiée dans l'instruction ORG, l'étiquette reçoit la valeur de l'expression (Cette étiquette peut ensuite être utilisée dans le champ opérande d'autres instructions pour représenter cette expression).
La directive END
L'instruction END est facultative dans un programme en langage assembleur, mais si elle est présente, elle doit être la dernière instruction (toutes les instructions suivantes sont ignorées dans l'assemblage). L'instruction END prend les deux formes suivantes :
label END |
label END expression |
où label est à nouveau facultative. Si la première forme est utilisée, le processus d'assemblage s'arrête et l'adresse de démarrage par défaut du programme est prise à 0000. Sinon, l'expression est évaluée et devient l'adresse de démarrage du programme (cette adresse de démarrage est incluse dans le dernier enregistrement du fichier hexadécimal de code machine au format Intel résultant de l'assemblage). Ainsi, la plupart des programmes en langage assembleur CP/M se terminent par l'instruction :
- END 100H
résultant en l'adresse de départ par défaut de 100h (début de la zone de programme transitoire).
La directive EQU
L'instruction EQU (equate) est utilisée pour définir des synonymes pour des valeurs numériques particulières. L'instruction EQU prend le format suivant :
label EQU expression |
où label doit être présente, et ne doit étiqueter aucune autre déclaration. L'assembleur évalue l'expression, et affecte cette valeur à l'identificateur donné dans le champ label. L'identificateur est généralement un nom décrivant la valeur d'une manière plus humaine. De plus, ce nom est utilisé dans tout le programme pour placer des paramètres sur certaines fonctions. Supposons que les données reçues d'un télétype apparaissent sur un port d'entrée particulier et que les données soient envoyées au télétype via le port de sortie suivant dans l'ordre. Par exemple, vous pouvez utiliser cette série d'instructions d'équivalence pour définir ces ports pour un environnement matériel particulier :
- TTYBASE EQU 10H ;NUMERO DE PORT DE BASE POUR TTY
- TTYIN EQU TTYBASE ;ENTREE DE DONNEES TTY
- TTYOUT EQU TTYBASE+1 ;SORTIE DE DONNEES TTY
Plus tard dans le programme, les instructions accédant au téléscripteur peuvent apparaître comme suit :
rendant le programme plus lisible que si les ports d'entrée/sortie absolus sont utilisés. De plus, si l'environnement matériel est redéfini pour démarrer les ports de communication du télétype à 7FH au lieu de 10H, la première instruction doit seulement être modifiée en :
- TTYBASE EQU 7FH ;NUMERO DE PORT DE BASE POUR TTY
et le programme peut être réassemblé sans modifier les autres instructions.
La directive SET
L'instruction SET est similaire à EQU, prenant le format suivant :
label SET expression |
sauf que l'étiquette peut apparaître sur d'autres instructions SET dans le programme. L'expression est évaluée et devient la valeur actuelle associée à l'étiquette. Ainsi, l'instruction EQU définit une étiquette avec une valeur unique, tandis que l'instruction SET définit une valeur étant valide à partir de l'instruction SET actuelle jusqu'au point où l'étiquette apparaît sur l'instruction SET suivante. L'utilisation de SET est similaire à l'instruction EQU, mais est utilisée le plus souvent pour contrôler l'assemblage conditionnel.
Les directives IF et ENDIF
Les instructions IF et ENDIF définissent une plage d'instructions en langage assembleur devant être incluses ou exclues pendant le processus d'assemblage. Ces déclarations prennent le format suivant :
IF expression statement#1 statement#2 ... statement#n ENDIF |
Lorsqu'il rencontre l'instruction IF, l'assembleur évalue l'expression suivant IF (tous les opérandes de l'expression doivent être définis avant l'instruction IF). Si l'expression donne une valeur différente de zéro, les instructions statement#1 à statement#n sont assemblées. Si l'expression est évaluée à zéro, les instructions sont répertoriées mais pas assemblées. L'assemblage conditionnel est souvent utilisé pour écrire un seul programme générique incluant un certain nombre d'environnements d'exécution possibles, avec seulement quelques parties spécifiques du programme sélectionnées pour un assemblage particulier. Les segments de programme suivants, par exemple, peuvent faire partie d'un programme communiquant avec un téléscripteur ou une console CRT (mais pas les deux) en sélectionnant une valeur particulière pour TTY avant le début de l'assemblage :
- TRUE EQU 0FFFFH ;DEFINIR LA VALEUR DE TRUE
- FALSE EQU NOT TRUE ;DEFINIR LA VALEUR DE FALSE
- ;
- TTY EQU TRUE ;TRUE SI TTY, FALSE SI CRT
- ;
- TTYBASE EQU 10H ;BASE DE PORTS ENTREE/SORTIE TTY
- CRTBASE EQU 20H ;BASE DE PORTS ENTREE/SORTIE CRT
- IF TTY ;ASSEMBLER PAR RAPPORT A TTYBASE
- CONIN EQU TTYBASE ;ENTREE CONSOLE
- CONOUT EQU TTYBASE+1 ;SORTIE CONSOLE
- ENDIF
- ;
- IF NOT TTY ;ASSEMBLER PAR RAPPORT A CRTBASE
- CONIN EQU CRTBASE ;ENTREE CONSOLE
- CONOUT EQU CRTBASE+1 ;SORTIE CONSOLE
- ENDIF
- ; ...
- IN CONIN ;LIRE LES DONNEES DE LA CONSOLE
- OUT CONTOUT ;ÉCRIRE LES DONNEES DE LA CONSOLE
Dans ce cas, le programme s'assemble pour un environnement où un téléscripteur est connecté, basé sur le port 10H. L'instruction définissant TTY peut être remplacée par :
- TTY EQU FALSE
et, dans ce cas, le programme s'assemble pour un CRT basé sur le port 20H.
La directive DB
La directive DB permet au programmeur de définir des zones de stockage d'initialisation au format d'octet simple précision. L'instruction DB prend le format suivant :
label DB e#1, e#2, ... , e#n |
où e#1 à e#n sont soit des expressions évaluées à des valeurs de 8 bits (le bit de poids fort doit être zéro), soit des chaînes de caractères ASCII d'une longueur maximale de 64 caractères. Il n'y a aucune restriction pratique sur le nombre d'expressions incluses sur une seule ligne source. Les expressions sont évaluées et placées séquentiellement dans le fichier de code machine à la suite de la dernière adresse de programme générée par l'assembleur. Les caractères de chaîne sont placés de la même manière dans la mémoire en commençant par le premier caractère et en terminant par le dernier caractère. Les chaînes de caractères d'une longueur supérieure à deux caractères ne peuvent pas être utilisées comme opérandes dans des expressions plus compliquées (c'est-à-dire qu'elles doivent être isolées entre les virgules).
Remarque : Les caractères ASCII sont toujours placés en mémoire avec le bit de parité réinitialisé (0). De plus, il n'y a pas de traduction des minuscules aux majuscules dans les chaînes de caractères.
L'étiquette facultative peut être utilisée pour référencer la zone de données dans le reste du programme. Voici des exemples d'instructions DB valides :
- data: DB 0,1,2,3,4,5
- DB data and 0ffh,5,377Q,1+2+3+4
- sign-on: DB 'SVP tapez votre nom',CR,LF,0
- DB 'AB' SHR 8,'C','DE',AND 7FH
La directive DW
L'instruction DW est similaire à l'instruction DB, sauf que des mots d'entreposage à deux octets en double précision sont initialisés. L'instruction DW prend le format suivant :
label DW e#1, e#2, ..., e#n |
où e#1 à e#n sont des expressions donnant des résultats 16 bits. Notez que les chaînes de caractères ASCII d'un ou deux caractères sont autorisées, mais les chaînes de caractères de plus de deux caractères ne sont pas autorisées. Dans tous les cas, l'entreposage des données est cohérent avec le microprocesseur 8080 : l'octet le moins significatif de l'expression est entreposé en premier en mémoire, suivi de l'octet le plus significatif. Voici des exemples d'instructions DW :
- doub: DW 0ffefh,doub+4,signon-$,255+255
- DW 'a',5,'ab','CD',6 shl 8 or llb
La directive DS
L'instruction DS est utilisée pour réserver une zone de mémoire non initialisée et prend le format suivant :
label DS expression |
où l'étiquette est facultative. L'assembleur commence la génération de code suivante après la zone réservée par le DS. Ainsi, l'instruction DS donnée ci-dessus a exactement le même effet que l'instruction suivante :
- label: EQU $ ;LA VALEUR DE L'ETIQUETTE EST L'EMPLACEMENT ACTUEL DU CODE
- ORG $+expression ;DEPASSER LA ZONE RESERVEE