Accueil
Accueil
Le
Club
Delphi
Kylix
C
C++
Java
J2EE
DotNET
& C#
Visual
Basic
Access
Pascal
Dev
Web
PHP
ASP
XML
UML
SQL
SGBD
Win
Linux
Autres

        


Qu'est-ce qu'un pointeur ?
auteur : Hdd34
Un pointeur renferme une adresse en mémoire, autrement dit un segment et un offset. Il désigne donc un emplacement en mémoire. Il convient de ne pas confondre le pointeur et ce vers quoi il pointe. Modifier un pointeur ne modifie pas ce vers quoi il pointe ! De même, copier un pointeur ne copie pas ce vers quoi il pointe. Pour ce faire, il faut copier une zone mémoire, et non un pointeur.
Pour mieux comprendre la nuance, on peut faire l'analogie du pointeur avec une étiquette sur une boîte. Recopier l'étiquette sur une autre boîte ne copie pas le contenu de la boîte, et modifier ce qu'il y a écrit sur l'étiquette ne modifie pas le contenu de la boîte.
Les pointeurs servent donc de lien avec la mémoire, et notamment avec la mémoire dynamique et le tas.

lien : Qu'est-ce que le tas (heap) ?
lien : Comment allouer plus de mémoire ?

Qu'est-ce que la pile (stack) ?
auteur : Hdd34
La pile est une zone mémoire où sont stockées toutes les données temporaires d'un programme. Comme son nom l'indique, elle fonctionne comme une pile d'assiettes. Néanmoins, vous ne pouvez pas bouger les "assiettes" comme vous le souhaitez : toute assiette posée doit être retirée pour pouvoir retirer celle qui se situe en dessous (c'est une pile LIFO, Last In First Out : dernier rentré, premier sorti). La pile se situe dans son propre segment (SS, stack segment) et est décrite à l'aide de deux pointeurs : le pointeur de la base de la pile (BP, base pointer), et le pointeur du haut de la pile (SP, stack pointer).
Chaque fois qu'une procédure ou une fonction est appelée, les divers paramètres qu'il faut lui transmettre sont placés sur la pile, et lorsque que l'on sort de la procédure, la pile est "nettoyée", autrement dit tous les paramètres sont en quelque sorte effacés de la pile.
La pile possède une taille limitée : 16 Ko par défaut, pouvant aller jusqu'à 64 Ko. Il faut donc prendre garde à ne pas "faire sauter la pile", autrement dit à ne pas placer trop de choses sur la pile, en appelant trop de procédures imbriquées ou récursives par exemple, sans quoi une erreur se produit.


Qu'est-ce que le tas (heap) ?
auteur : Hdd34
Le tas est la zone de mémoire dynamique. D'une taille maximale de 640 Ko, il permet de créer des variables dynamiquement, c'est à dire à l'exécution. Pour ce faire, il faut utiliser des pointeurs et les allouer à l'aide de New ou GetMem, puis les supprimer avec Dispose ou FreeMem. Le tas permet de passer outre la limitation de 64 Ko de données, bien qu'il ne soit possible d'allouer que 64 Ko à la fois.

lien : Comment allouer plus de mémoire ?

Qu'est-ce que l'assembleur ? A quoi peut-il servir ?
auteur : Hdd34
L'assembleur est parfois appelé "langage machine". C'est le langage de programmation le plus proche de la machine qui puisse être compris relativement simplement par l'homme. Un pas de plus dans la direction de la machine reviendrait à écrire en codes hexadécimaux, ce qui n'est pas réellement viable.
Donc, contrairement au Pascal, qui appartient aux langages dits de "haut niveau", l'assembleur est un langage de "bas niveau".

Remarque :
  • On confond pour ainsi dire toujours l'assembleur (le programme qui transforme le code en code machine compréhensible par le processeur) et le code assembleur en lui-même.


Relativement obscur pour les néophytes, l'assembleur est néanmoins le seul outil existant pour pallier aux lacunes du Pascal. En effet, le Pascal, bien que très polyvalent, ne sait pas tout faire, et il est parfois nécessaire de faire appel à un langage plus spécialisé, tel l'assembleur, pour accéder au coeur de la machine.

L'assembleur peut aussi être utilisé dans les routines dites "critiques", autrement dit qui nécessitent des performances accrues.

Pour ajouter de l'assembleur dans votre programme, vous pouvez soit ajouter un bloc asm...end; soit créer une procédure en assembleur, en ajoutant la directive assembler à sa déclaration :


Bloc d'assembleur
begin ... asm ... end; ... end;



Procédure assembleur
procedure TestAsm; assembler; asm ... end;


Attention toutefois, l'assembleur doit être utilisé en toute connaissance de cause. En effet, comme il est très proche de la machine, il est spécifique au type de machine utilisée. L'assembleur compris par BASM, l'assembleur intégré à Turbo Pascal, est un assembleur pour processeurs x86, comme les Pentium d'Intel, ou les processeurs d'AMD comme l'Athlon. Néanmoins, chaque génération de processeur apporte son lot de nouveautés, comme les extensions MMX qui sont apparues avec les Pentium Pro.
Turbo Pascal ayant été conçu bien avant, dans les années 80, il ne sait pas explicitement utiliser ces nouvelles instructions, pour lesquelles il convient de faire preuve de ruse.

Nous ne parlerons ici que de la plus utilisée d'entres elles : comment accéder aux instructions 32 bits des processeurs 386 et supérieurs, là où Turbo Pascal ne connaît que les instructions 16 bits des 286 ?

Pour bien comprendre le principe, il faut revenir au code hexadécimal. Bien entendu, ce qui suit s'adresse aux personnes connaissant le langage assembleur.

Considérons les deux instructions suivantes :


mov ax, cx et mov eax, ecx


Converties en code hexadécimal, on obtient :


89h C8h et 66h 89h C8h


On peut donc remarquer que pour le code 32 bits, seul l'octet 66h a été ajouté. Si seul un cas particulier a été examiné ici, on peut vérifier rapidement qu'il en est de même pour toutes les instructions 32 bits. Il suffit de faire précéder une instruction 16 bits par un octet 66h pour transformer cette instruction 16 bits en instruction 32 bits.

Ainsi, pour coder mov eax, ecx, on écrira :


asm db 66h; mov ax, cx end;


Seule précaution à prendre : lors de l'utilisation de constantes. En effet, il faut bien prendre garde à indiquer une constante sur 32 bits, et non sur 16 bits comme Turbo Pascal le fera tout seul.

De fait, pour coder mov eax, 0, on écrira :


asm db 66h; mov ax, 0; dw 0000h end;


Le dw 0000h correspondant au mot de poids fort de la constante.

lien : Qu'est-ce que les registres processeur ?

Appels far, appels near, qu'est-ce que cela signifie ?
auteur : Hdd34
Chaque programme EXE conçu avec Turbo Pascal est composé de plusieurs segments : des segments de code, un segment de données, et un segment de pile. De plus, Turbo Pascal place toujours chaque module (programme principal ou unité) dans un segment distinct.
Bien entendu, il y a communication entre chacun des segments de code, notamment pour appeler des procédures et fonctions.
C'est ici qu'intervient la notion d'appels "far" et d'appels "near". En effet, sitôt que l'on entre dans une procédure, il faut aussi penser à en sortir. Par conséquent, on sauve sur la pile la position actuelle avant d'appeler la procédure.
Si on reste dans le même segment, seul l'offset est à empiler. On parle alors d'appel "near". Si par contre, on change de segment, alors il faut penser également à empiler le segment dans lequel on se trouve, et on parle d'appel "far".

De fait, comme une unité se situera toujours dans un segment différent du programme principal ou d'une autre unité, toutes ses procédures et fonctions déclarées dans la partie interface seront déclarées comme à appel "far".
De même, comme une procédure ou une fonction déclarée dans le programme principal n'est accessible que dans ce même programme principal, elle sera toujours déclarée comme à appel "near".

Un problème se pose donc quand une procédure est déclarée dans le programme principal et qu'elle est destinée à être utilisée en-dehors de celui-ci. C'est notamment le cas des gestionnaires d'interruption. Dans ce cas, il faut forcer Turbo Pascal à adopter un mode d'appel "far".
Pour ce faire, deux solutions s'offrent à nous. Soit un ajoute la directive far à l'en-tête de la procédure, soit on la place entre les directives de compilation {$F+}...{$F-} :


Avec directive far
procedure AppelFar; far; begin ... end;



Avec directives de compilation $F
{$F+} procedure AppelFar; begin ... end; {$F-}

        

Consultez les autres F.A.Q's

Les sources présentés sur cette pages sont libre de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©2004  Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérets. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright 2000..2005 www.developpez.com