Langage de programmation C (XIII). Compilateur C et autres langages
1992/03/01 Alegria Loinaz, Iñaki | Maritxalar, Montse Iturria: Elhuyar aldizkaria
Dans le onzième chapitre, nous avons vu que le liant (linkers) peut fusionner en un seul programme exécutable différents modules compilés séparément. Par conséquent, une fois compilés séparément les modules des différentes langues, stockés ou non dans la bibliothèque, lorsqu'il s'agit de modules d'objets, ils peuvent être regroupés par liant.
Cependant, pour appeler les routines écrites en langage d'assemblage sur PC depuis un programme C, il faut tenir compte d'une série de points, qui est la première étape de ce chapitre. D'autre part, lors de la compilation des programmes C sur les ordinateurs 16 bits comme PC, il faut faire différentes options, comme nous le verrons dans la deuxième section. Enfin, dans le troisième paragraphe, nous analyserons comment les fonctions originales du système d'exploitation peuvent être référencées, appels système.
C et langage d'assemblage
Les programmes exécutés sur les PC peuvent être organisés en 6 modèles différents de la mémoire en fonction du compilateur. Selon les modèles que nous analyserons dans le paragraphe suivant, les exposants peuvent être de trois types: near, far et huge.
Alors que les démonstrateurs de type near sont de 16 bits, le reste est de 32 bits, car dans le premier cas on suppose que la direction est dans le même segment. Les démonstrateurs far et huge sont similaires (car ils sont tous deux stockés en 32 bits) et la seule différence entre eux réside dans la mesure où ils peuvent être exprimés dans le déplacement.
sont des mots-clés néar, far et huge. Ils peuvent être utilisés pour les compilateurs C sur PC et dans la définition des démonstrateurs, tableaux et fonctions. Pour utiliser une routine écrite par un programme C avec langage d'assemblage, il n'est pas nécessaire de faire quelque chose de spécial, il suffit d'être érigé et référencé comme fonction. Cependant, dans le développement de la fonction, on peut utiliser near, far ou huge selon le modèle de la mémoire.
Si nous écrivons une routine appelée Ct avec langage d'assemblage, il faut tenir compte des règles suivantes :
- les paramètres seront placés dans la pile, généralement dans l'ordre inverse, c'est-à-dire que la pile commencera à être remplie à partir du dernier paramètre. La longueur des paramètres dépendra des caractéristiques des données analysées au chapitre 2.
- dans la routine, avant les actions correspondantes, vous devez: 1) stocker dans une pile le contenu des enregistrements à utiliser (toujours BP et si nécessaire SI, DI, SS, DS ou CS). 2) Dans le registre BP la valeur de SP est enregistrée, en obtenant les paramètres via BP. Le premier paramètre sera dans (BP + 4) si la fonction est near et (BP + 6) dans le reste des cas.
- La valeur du registre SP sera réduite pour l'utilisation de variables locales.
- Une fois les actions correspondantes à la routine effectuées, le résultat du retour sera inscrit au registre AX et la valeur des enregistrements stockés ci-dessous sera récupérée.
Le programme 1 affiche une routine écrite avec un langage d'assemblage qui multiplie deux nombres, sans que les pseudo-commandes correspondant aux segments n'apparaissent. Il convient de noter que le nom des routines d'assemblage est placé le caractère devant.
![](images/A57027.jpg)
Compilateur C sur les ordinateurs 16 bits
Comme déjà indiqué, les programmes PC peuvent choisir parmi 6 modèles de mémoire différents lors de la compilation. Il s'agit d'un système de mémoire segmenté en PC, dans lequel on distingue quatre segments (de commandes, de données, de pile et extra) auxquels correspond un enregistrement: CS, DS, SS et ES. Il existe des modèles pour sélectionner la valeur de ces enregistrements et donc la longueur du programme.
Avec le modèle Small, seuls deux segments, celui des commandes et celui des données sont utilisés. Par conséquent, les programmes auront un maximum de 128K. Il est utilisé pour les petits programmes. Le modèle Medium représente un segment de données et plusieurs segments pour les commandes. Ainsi, tant que les données ne dépassent pas 64K, les commandes peuvent atteindre un Mega.
C'est pour de longs programmes qui manipulent peu de données. Le modèle Compact s'oppose à ce qui précède : commandes inférieures à 64K et données jusqu'à un Mega. Convient pour les programmes qui manipulent une grande quantité de données. Avec le modèle Large, les commandes et les données peuvent atteindre un Mega, car les deux segments sont multiples. Par conséquent, il est adapté pour les grands programmes. Le modèle Huge est similaire au modèle Large, mais les données statiques sont placées sur un même segment.
Comme le modèle augmente, le programme est plus long et lent en raison des échanges entre les journaux et les piles.
Le sixième modèle, appelé Tiny, n'est offert que par le compilateur Turbo C. Selon ce modèle, le programme complet est un segment unique qui ne peut pas dépasser 64K.
Il est spécifié dans la commande compiler modèle et le compilateur C de Microsoft est utilisé comme:
![](images/A57027-a.jpg)
Appels système depuis C
Les appels système sont des opérations originales du système d'exploitation. Donc, selon le système d'exploitation, nous serons face à différents appels système.
Les appels système ci-dessous sont les deux systèmes d'exploitation les plus importants : MS-DOS et UNIX.
MS-DOS
Dans le fichier dos.h sont inclus les fonctions de bibliothèque qui emploient des appels système. Les plus significatifs sont:
![](images/A57027-b.jpg)
Les fonctions bdos et intdos permettent d'effectuer différents appels en fonction du paramètre.
UNIX
Sous UNIX, il existe de nombreux appels système afin d'utiliser directement les services du système d'exploitation. Dans les différents fichiers de titre se trouve la description des fonctions relatives aux appels système, car la définition est compilée dans la bibliothèque.
Les appels les plus importants sont:
appels sur les processus
![](images/A57027-c.jpg)
appels sur les fichiers et appareils
open, read, write, close et lseek comme dans le chapitre précédent
![](images/A57027-d.jpg)
communication interprocess
![](images/A57027-e.jpg)
L'utilisation de ces appels système est assez complexe et dépend de la version. C'est pourquoi nous n'allons pas approfondir plus ici.
Dans les deux chapitres suivants, concrètement dans les deux derniers, nous utiliserons les jugements et fonctions analysés tout au long des précédents, en programmant des exemples complexes.
![](https://elia.eus/static/elhuyar/img/elia_RGB.png)
Gai honi buruzko eduki gehiago
Elhuyarrek garatutako teknologia