Section courante

A propos

Section administrative du site

La fonction EXEC

La fonction EXEC a été mentionnée brièvement plusieurs fois auparavant en relation avec le processeur de commandes. Nous examinerons ici plus en détail la fonction EXEC et décrirons son fonctionnement.

Parent/enfant

La fonction EXEC est l'une des nombreuses fonctions DOS pouvant être appelées avec l'interruption 21h (fonction 4Bh). De manière générale, cette fonction permet à un programme parent (programme principal) d'appeler un programme fils (programme secondaire). Le programme enfant est chargé à partir d'un périphérique de stockage de masse dans la mémoire, puis s'exécute. Si ce programme fils ne devient pas résident, la mémoire occupée par le fils est libérée après l'exécution du programme. Le programme enfant peut également appeler un autre programme travaillant avec le programme parent. Cela crée un type de chaînage de programmes limité uniquement par la quantité de RAM disponible.

Un exemple de la fonction EXEC est le processeur de commandes. À l'aide de la fonction EXEC, le processeur de commandes exécute les programmes spécifiés par l'utilisateur et devient le programme parent. Certains programmes (tels que Microsoft Word) permettent à l'utilisateur d'exécuter des commandes DOS à partir du programme principal à l'aide de cette fonction.

Le programme parent peut transmettre des paramètres au programme enfant dans la ligne de commande et peut également transmettre des paramètres à l'aide du bloc d'environnement. Il peut également transférer des informations au programme enfant au sein du PSP. Étant donné que le programme enfant, comme tous les programmes exécutables, est précédé d'une PSP, des informations peuvent être entrées dans les deux FCB de ce PSP et rendues accessibles au programme enfant.

Programme enfant

Après avoir transféré le contrôle au programme enfant, il peut accéder à tous les fichiers et périphériques précédemment ouverts par le programme parent (ou l'un des programmes parents) avec une fonction de descripteur de fichier. Cela permet au programme enfant de lire des informations à partir d'un fichier ou d'écrire des informations dans un fichier dont le descripteur de fichier est connu (le programme enfant n'a pas besoin de connaître le nom du fichier). Ceci n'est possible que si le descripteur de fichier a été passé par le programme parent dans l'une des trois méthodes décrites, ou si le programme enfant fait référence à l'un des cinq descripteurs de fichier étant toujours ouverts. Ces accès aux fichiers affectent le pointeur de fichier. Comme les valeurs ne sont pas réinitialisées, ces accès aux fichiers deviennent "visibles" pour le programme parent lorsque le contrôle revient au programme parent.

Après l'exécution du programme enfant, le contrôle revient au programme parent et l'exécution continue. Pour transmettre des informations (par exemple, une erreur survenue lors de l'exécution du programme enfant), le programme enfant peut passer une valeur numérique à la fin de son exécution. Cela peut être fait en utilisant la fonction 4Ch de DOS, terminant un programme et renvoie un code au programme parent.

La communication entre le programme parent et le programme enfant ne fonctionne que si les deux programmes s'accordent sur cette valeur de retour. Après le retour du contrôle au programme parent, celui-ci peut déterminer le code à l'aide de la fonction 4Dh de l'interruption 21h. Pour utiliser la fonction 4Dh seul le numéro de fonction est passé dans le registre AH. Le code transmis par le programme enfant est renvoyé au programme appelant (parent) dans le registre AL.

Fin du programme enfant

De plus, le contenu du registre AH indique comment le programme enfant s'est terminé. La valeur 0 indique une fin normale, tandis que 1 indique que le programme enfant s'est terminé lorsque l'utilisateur a appuyé sur Ctrl+C ou Ctrl+Break. Si une erreur lors de l'accès à un périphérique d'entreposage de masse a forcé le programme enfant à se terminer, un code de 2 est passé dans le registre AH. Enfin la valeur 3 indique que le programme fils a résulté d'un appel à la fonction 31h, ou l'interruption 27h ; le programme enfant devient alors résident en mémoire.

Comme mentionné précédemment, la fonction EXEC ne peut charger le programme enfant que si suffisamment de mémoire est disponible. Bien que DOS puisse estimer assez précisément la mémoire nécessaire aux programmes EXE, il ne peut pas en faire autant pour les programmes COM. Pour les programmes COM, DOS réserve toute la mémoire inutilisée. Pour cette raison, un programme COM ne peut pas appeler un autre programme avec la fonction EXEC, car DOS ne réserve aucune mémoire supplémentaire. Il en va de même pour de nombreux programmes EXE. Si un appel à un programme enfant est nécessaire, l'espace mémoire requis doit être libéré du programme appelant avant d'appeler la fonction EXEC.

EXEC

Si la fonction EXEC est appelée, les différents paramètres sont chargés dans les registres avant l'appel de l'interruption 21h. Le numéro de fonction 4Bh est passé dans le registre AH. Une valeur de 0 ou 3 est passée dans le registre AL. Une valeur de 0 indique que la fonction EXEC doit charger et exécuter le programme tandis qu'une valeur de 3 indique que le programme est chargé en recouvrement (sans l'exécuter). L'adresse du nom du programme à charger ou à exécuter est passée dans le couple de registres DS:DX. Et l'adresse du bloc de paramètres est passée dans la paire de registres ES:BX.

Le nom du programme est spécifié sous forme de chaîne de caractères ASCII et se termine par un caractère nul (code ASCII 0). Le nom du programme peut inclure le nom du périphérique et une description complète du chemin. Son dernier élément est le nom du programme qui, outre le nom lui-même, doit avoir l'extension .COM ou .EXE. Si le nom du périphérique ou la désignation du chemin sont omis, le système recherche le programme dans le répertoire actuel du périphérique actuel. Comme la fonction EXEC ne peut pas exécuter directement un fichier de traitement par lots, le nom du programme passé ne peut pas contenir l'extension .BAT.

Traitement par lot enfant

Si un fichier de commandes doit être exécuté, le fichier COMMAND.COM (processeur de commandes) doit être appelé en premier. Pour indiquer qu'un fichier de traitement par lots doit être exécuté, le paramètre /c suivi du nom du fichier de traitement par lots à exécuter est inclus sur la ligne de commande. Outre la possibilité d'exécuter un fichier de traitement par lots, l'appel du processeur de commandes avec le paramètre /c offre la possibilité d'appeler n'importe quel autre programme, et même des commandes DOS internes telles que DIR.

Outre l'appel direct d'un programme, il est possible de spécifier des noms de programmes sans extensions de fichiers lors d'un appel au processeur de commandes. Le processeur de commandes recherche un fichier EXE ; puis un fichier COM ; et enfin un fichier BAT. Si aucun de ces fichiers n'existe dans le répertoire courant, il recherche tous les répertoires spécifiés dans la commande PATH. Cette chaîne de caractères d'événements n'est pas suivie lors d'un appel de programme direct sans l'ajout du processeur de commande.

Le répertoire contenant le processeur de commandes doit être spécifié. S'il n'est pas spécifié, il sera chargé à partir du chemin indiqué par la chaîne de caractères d'environnement COMSPEC de la commande SET.

Blocs de paramètres

Les paramètres peuvent être passés au processeur de commandes dans le bloc de paramètres suivant le nom du programme. Ces paramètres sont identiques aux paramètres saisis au clavier lors de l'appel du programme. Nous verrons bientôt comment ces paramètres affectent la fonction EXEC, mais examinons d'abord la structure du bloc de paramètres lorsque le registre AL contient la valeur 0. L'adresse de ce bloc est transmise à la fonction EXEC dans la paire de registres ES:BX :

Ordre Positionnement Description
1 0 à 1 Adresse de segment du bloc d'environnement
2 2 à 3 Adresse de déplacement du bloc d'environnement
3 4 à 5 Adresse de segment du paramètre de commande
4 6 à 7 Adresse de déplacement du premier FCB
5 8 à 9 Adresse de segment du premier FCB
6 10 à 11 Adresse de déplacement du deuxième FCB
7 12 à 13 Adresse de segment du deuxième FCB

Le champ 1 indique l'adresse de segment du bloc d'environnement du programme enfant. Ce bloc ne nécessite pas d'adresse de déplacement puisqu'il commence toujours à un emplacement divisible par 16, et donc son adresse de décalage est toujours à 0.

Bloc environnement

Le processeur de commandes et d'autres programmes obtiennent des informations du bloc d'environnement. Le bloc d'environnement est une série de chaînes de caractères ASCII. Ces informations peuvent inclure des chemins pour les recherches de fichiers. Chaque chaîne de caractères a la syntaxe suivante, terminée par un caractère nul (code ASCII 0) :

Name = Parameter

Les chaînes de caractères individuelles se suivent séquentiellement (c'est-à-dire que le caractère nul d'une chaîne de caractères est immédiatement suivi du caractère de début de la chaîne de caractères suivante). Le bloc d'environnement se termine par un caractère nul. Tout bloc d'environnement a une longueur maximale de 32 Ko.

Le bloc d'environnement peut être changé ou modifié par l'utilisateur à l'aide des commandes SET et PATH du DOS. Les programmes restant résidents après l'exécution ne sont pas affectés par les modifications apportées au bloc d'environnement via ces deux commandes DOS une fois rendues résidentes.

Si le programme parent souhaite transmettre des informations au programme enfant en utilisant le bloc d'environnement, il peut soit construire un nouveau bloc d'environnement, soit compléter son propre bloc d'environnement avec cette information. Dans le premier cas, l'adresse de segment du nouveau bloc d'environnement est spécifiée dans le champ fllSt du bloc de paramètres. Si le programme enfant doit avoir accès au bloc d'environnement du programme parent, spécifiez une valeur de 0 dans ce champ. Avant de confier le contrôle au programme enfant, la fonction EXEC entrepose l'adresse de segment du bloc d'environnement dans l'emplacement mémoire à l'adresse 2Ch du PSP du programme enfant.

Si le programme enfant doit utiliser un nouveau bloc d'environnement, il doit contenir au moins 3 chaînes de caractères faisant normalement partie du bloc d'environnement du programme parent et sont importantes pour le processeur de commande :

COMSPEC = Parameter
PATH = Parameter
PROMPT = Parameter

Si un programme enfant modifie son bloc d'environnement, le bloc d'environnement du programme parent reste inchangé une fois que le programme enfant a terminé son exécution.

Les champs 2 et 3 indiquent l'adresse des paramètres de commande étant passée à la PSP du programme à partir de l'adresse 80h. Ils doivent avoir la même structure en mémoire que celle attendue par DOS dans la PSP. Le premier octet indique le nombre de caractères de commande moins 1, puis suit les caractères de commande comme des codes ASCII normaux. Les paramètres de commande se terminent par un retour chariot (code ASCII 13) qui n'est pas inclus dans le nombre de caractères. Le premier caractère de la chaîne de caractères doit être un espace pour la compatibilité avec COMMAND.COM.

Pour appeler un programme de traitement par lots (appelé DO.BAT) à l'aide du processeur de commandes, les paramètres de commande suivants doivent être spécifiés sous forme de chaîne de caractères en mémoire :

  1. DB 10," /C DO.BAT",13

La fonction EXEC copie les paramètres de commande de façon contrôlée dans la PSP du programme à exécuter. Il supprime tous les paramètres redirigerant l'entrée ou la sortie, car une redirection de l'entrée/sortie standard ne peut être effectuée que par le programme parent. Le programme enfant peut toujours utiliser la redirection d'entrée/sortie si les descripteurs d'entrée/sortie standard ont été redirigés par le programme parent.

Les champs 6, 7, 10 et 11 indiquent deux FCB installés dans lE PSP à l'adresse 5Ch ou 6Ch. Si ce n'est pas obligatoire, indiquez -1 (FFFFH) dans ces deux champs. Si l'exécution du programme l'exige, entrez les deux premiers paramètres de commande dans les deux FCB avec la fonction 29h de DOS. Avant de passer le contrôle au programme enfant, la fonction EXEC copie ces deux FCB dans la PSP du programme enfant.

Même si tous les registres et le bloc de paramètres ont maintenant les valeurs requises, la fonction EXEC ne peut pas encore être appelée. Puisqu'il détruit le contenu de tous les registres jusqu'aux registres CS et IP pendant l'exécution, le contenu de tous les registres doit être placé sur la pile avant d'être appelé. Ensuite, le contenu des registres SS et SP doit être stocké dans le segment de code. Ce n'est qu'alors que la fonction 4Bh de l'interruption 21h peut être appelée pour activer la fonction EXEC. Une fois la fonction EXEC terminée, le drapeau de report signale si la fonction s'est exécutée normalement. Avant que l'exécution du programme puisse continuer, la valeur des registres SS et SP doit être restaurée, à partir du segment de code. Ensuite, le contenu de l'autre registre peut être restauré à nouveau à partir de la pile.

La fonction EXEC a un but différent lorsqu'une valeur de 3 apparaît dans le registre AL. Dans ce cas, il charge un programme COM ou un programme EXE en mémoire sans s'exécuter. Une fois le programme cible chargé, le contrôle revient immédiatement au programme appelant. Contrairement à la sous-fonction 0, le programme se charge à une adresse mémoire indiquée par le programme appelant au lieu de se charger à un emplacement non spécifique. Comme aucun paramètre n'est passé au programme chargé, le bloc de paramètres a une structure différente lors de l'appel de la sous-fonction 3 que lors de l'appel de la sous-fonction 0 :

Champ Octet Description
1 0 à 1 Adresse de segment où le recouvrement est chargé
2 2 à 3 Facteur de relocalisation

Avant l'appel de la fonction, l'adresse du segment auquel le programme doit être chargé est spécifiée dans le premier champ du bloc de paramètres. Si le programme appelant n'a pas assez de mémoire disponible pour charger le programme externe, il doit demander de la mémoire supplémentaire avec l'une des fonctions de gestion de la mémoire DOS. Le programme chargé se charge directement à l'adresse de segment indiquée avec l'adresse de déplacement 0 puisqu'aucune PSP ne précède le programme.

Relocalisation

Le facteur de relocalisation ajuste l'adresse de segment du programme appelé. Étant donné que ce facteur s'applique uniquement aux programmes EXE (les programmes COM ne peuvent pas avoir d'affectations de segments spécifiques), le facteur de relocalisation pour les programmes COM doit toujours être égal à 0. Le facteur de relocalisation pour les programmes EXE doit indiquer l'adresse du segment où le programme sera chargé pour confirmer aux affectations de segment du programme.

Une fois le programme chargé, ses routines sont prêtes à être accédées. Les routines du programme chargé doivent toujours être traitées comme des sous-routines ; et donc appelé avec l'instruction CALL en langage machine. Il doit toujours s'agir d'une instruction de type FAR même si le programme chargé peut être situé immédiatement après le programme appelant, mais ne peut jamais avoir la même adresse de segment. L'adresse de déplacement pour CALL est toujours 100h pour un programme COM, puisque l'exécution commence toujours immédiatement après le PSP à l'adresse 100h. Cela crée un problème. La sous-fonction 3 empêche le chargement du PSP. Par conséquent, le segment de code du programme COM commence à l'adresse 0, et non à l'adresse de déplacement 100h (par rapport au segment de charge). Étant donné que toutes les instructions de saut et les accès aux données dans le programme COM sont relatifs à l'adresse 100H et non à l'adresse 0, vous ne pouvez pas exécuter une instruction CALL FAR avec l'adresse du segment de chargement comme adresse de segment et l'adresse 0 comme adresse de déplacement. L'adresse de segment pour le CALL FAR doit indiquer l'adresse du segment de charge moins 10h et l'adresse 100H comme adresse de déplacement.

Si le programme COM sert spécifiquement de recouvrement pour un autre programme, des adresses d'entrée autres que l'adresse 100H sont possibles. Dans ce cas, seule l'adresse de déplacement de l'instruction CALL FAR change. L'adresse du segment doit rester inférieure de 10h à l'adresse du segment de charge.

EXEC et mémoire

Le problème est différent pour les programmes EXE. S'ils sont chargés pour exécution à l'aide de la sous-fonction 0, la fonction EXEC positionne le segment de code et le pointeur d'instruction sur l'instruction ayant été déclarée comme première instruction dans le source assembleur. Cette adresse est cependant inconnue du programme ayant chargé le programme EXE en recouvrement. Ceci peut être facilement résolu en plaçant la première instruction exécutable dans le programme EXE au début du programme EXE.

Cela rend son adresse de déplacement 0. La source du programme EXE ne doit pas être dans la séquence normale avec la pile en premier. Dans ce cas, le segment de code doit être le premier segment de la source pour s'assurer qu'il commence le programme EXE.

Le CALL FAR utilise l'adresse du segment de charge comme adresse de segment et l'adresse 0 comme adresse de déplacement.

Alors que le BASICA/GWBASIC, QuickPascal/ Turbo Pascal et QuickC/Turbo C ont des commandes ou des procédures pour appeler un programme à partir d'un autre programme, les routines en langage assembleur doivent utiliser la fonction 4Bh de DOS.



Dernière mise à jour : Lundi, le 23 janvier 2023