__EMIT__ |
Émettre |
---|---|
Turbo C | dos.h |
Syntaxe
void __emit__(argument, ... ); |
Description
Cette fonction permet d'insérer des valeurs littérales directement dans le code.
Remarques
- La fonction __emit__ est une fonction en ligne vous permettant d'insérer des valeurs littérales directement dans le code objet lors de la compilation. Il est utilisé pour générer des instructions en langage machine sans utiliser le langage d'assemblage en ligne ou un assembleur. Il peut être utilisé dans l'environnement de développement intégré, ce que le code d'assemblage en ligne ne peut pas faire.
- Généralement, les paramètres d'un appel __emit__ sont des instructions machine à un octet. Cependant, en raison des capacités de cette fonction, des instructions plus complexes, complètes avec des références aux variables C, peuvent être construites.
- Avertissement ! Cette fonction ne doit être utilisée que par les programmeurs se sentant à l'aise avec le langage machine de la famille de microprocesseurs 80x86. Vous pouvez utiliser cette fonction pour placer des octets arbitraires dans le code d'instruction d'une fonction; si l'un de ces octets est incorrect, le programme se comporte mal et peut facilement planter votre machine. Le Turbo C n'essaye en aucun cas d'analyser vos demandes d'exactitude. Si vous encodez des instructions modifiant les registres de la machine ou la mémoire, le Turbo C n'en sera pas conscient et risque de ne pas conserver correctement les registres, comme il le ferait dans de nombreux cas avec le langage d'assemblage en ligne (par exemple, il reconnaît l'utilisation des registres SI et DI dans instructions en ligne). Vous êtes complètement seul avec cette fonction.
- Vous devez passer au moins un paramètre à __emit__ et n'importe quel nombre peut être donné. Les paramètres de cette fonction ne sont pas traités comme les autres paramètres d'appel de fonction dans le langage. Un paramètre passé à __emit__ ne sera en aucun cas converti.
- Il existe des restrictions spéciales sur la forme des paramètres de __emit__. Ils doivent se présenter sous la forme d'expressions pouvant être utilisées pour initialiser un objet statique. Cette situation signifie que les constantes entières et à virgule flottante et les adresses des objets statiques peuvent être utilisées. Les valeurs de ces expressions sont écrites dans le code objet au moment de l'appel, exactement comme si elles étaient utilisées pour initialiser des données. L'adresse d'une variable automatique ou d'un paramètre, plus ou moins un décalage constant, peut également être utilisée. Pour ces paramètres, le déplacement de la variable par rapport à BP est entreposé.
- Le nombre d'octets placés dans le code objet est déterminé à partir du type de le paramètre, sauf dans les cas suivants : si une constante entière signée (c'est-à-dire 0x90) apparaît dans l'intervalle de 0 à 255, elle est traitée comme s'il s'agissait d'un caractère. Si l'adresse d'une variable auto ou paramètre est utilisée, un octet est écrit si le déplacement de la variable par rapport à BP est compris entre -128 et 127; sinon un mot est écrit.
- On peut écrire un simple octet de la façon suivante :
__emit__(0x90);
Si vous voulez qu'un mot soit écrit, mais que la valeur que vous transmettez est inférieure à 255, convertissez-le simplement en non signé, comme suit :
__emit__(0xB8, (unsigned) 17);
ou
__emit__(0xB8, 17u);
Les valeurs d'adresse à deux ou quatre octets peuvent être forcées en convertissant une adresse en void near * ou en void far * respectivement.
Dernière mise à jour : Vendredi, le 26 Février 2021