IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Pascal Discussion :

[LG]librairies : utiliser seulement quelques fonctions


Sujet :

Langage Pascal

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14
    Points : 6
    Points
    6
    Par défaut [LG]librairies : utiliser seulement quelques fonctions
    Salut,


    Alors voici ce que j'aspire à faire, si c'est possible evidement...

    Chacun sait que dans un code pascal, on doit charger des librairies telles que "dos", "crt" ou encore "graph" afin de pouvoir utiliser les fonctions prédéfinies dans celles ci.


    Mon objectif est de minimiser au maximum la taille de mon .exe. Or, en incluant la librairie "dos" par exemple, on inclue a l'exe toutes les fonctions de la librairie dans l'exe ; ce qui a pour conséquence d'utiliser plus de place que besoin. (je pense que ça fonctionne comme ça, je me trompe ?)

    Je me demandais donc, si cela etait possible, par des directives de compilations par exemple ou je ne sais quoi, n'inclure dans l'exe que les fonctions/procedures utilisées dans le code source ?

    Exemple : la librairie "graph" dispose de fonctions telles que Rectangle, Line, LineTo, MoveTo, OutText, OutTextXY, etc...

    Un code n'utilisant que les fonctions Line, Rectangle et OutText n'aurais donc que faire des autres fonctions.

    L'idee est donc de n'inclure que les fonctions Line, Rectangle et OutText dans l'exe.


    Je pense avoir été clair, et j'espère que vous pourrez me répondre.

    Merci.

  2. #2
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Citation Envoyé par wwwroom
    Je pense avoir été clair
    Très !

    Citation Envoyé par wwwroom
    je pense que ça fonctionne comme ça, je me trompe ?
    J'en ai bien peur...

    Si mes souvenir sont bons, les compilateurs Pascal s'arrange pour n'inclure que le nécessaire dans un programme. Ca fait partie des optimisations.

    Quoiqu'il en soit, et en admettant que je me trompe, cela supposerait de connaître tous les liens entre les procédures. Et comme en plus, ces procédures là sont codées en assembleur, ça tombe dans le domaine de l'impossible en n'étant pas du côté compilateur.

    Mais bon essai quoiqu'il en soit

    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    uhm je pensais pas me trompé sur le fait que toutes les fonctions sont incluses a la compilation....c'est un prof qui me l'a dit....mais bon j'ai jamais rien appris dans ses cours, donc ça m'etonnerai pas qu'il soit a coté...


    Bon ben merci hdd34, jvais approfondir du coté de google...

  4. #4
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Sinon si ca t'amuse, tu prends un éditeur hexadécimal, et tu cherches les lignes d'opcodes qui font des rectangles , puis tu les inclus dans ton code...

    Have fun !!
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  5. #5
    Membre expérimenté
    Avatar de Juju_41
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2003
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2003
    Messages : 974
    Points : 1 557
    Points
    1 557
    Par défaut
    Je tiens à préciser que TP6 inclut la totalité des unités chargées dans l'éxectuable et non les quelques fonctions utilisées
    Le moyen "le plus simple" pour contourner ce problème serait de trouver les sources de ces unités afin d'en faire des version "light".
    Sinon tu peux t'amuser à chercher la structure des fichiers TPU ou même désassembler et faire mumuse avec le code en hexa comme te le suggère wormful_sickfoot

    Bon courage ...
    Avant de poster, merci de consulter les règles du forum

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    ok, pour ce qui est de faire une version "lite" je suis dessus....mais c'est pas evident...


    Sinon est ce qu vous pourriez m'apportez des precisions sur le fait de jouer avec l'hexa ? ...si j'arrive pas a faire de version lite j'vais voir ce que sa donne en hexa


    merci

  7. #7
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Sinon est ce qu vous pourriez m'apportez des precisions sur le fait de jouer avec l'hexa ? ...si j'arrive pas a faire de version lite j'vais voir ce que sa donne en hexa
    Oui mais euh... c'était une blague !! C'est de la folie de bidouiller le code machine...
    En ce qui concerne la version "Light", je suis pas sûr que tu puisses trouver les sources de Turbo Pascal parce que le logiciel est encore protégé... Donc soit tu as un contact très influent chez Borland, soit tu bidouilles mais ca sera pas propre du tout et ultra compliqué à faire...

    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    lol ok ben j'vais laisser l'asm de coté alors !



    J'aimerais quand même vous apporter un précision (de taille je pense)..


    Mon exe est constitué d'un code source principale et d'un TPU maison.
    Dans mon code source j'utilise les librairies DOS, CRT, GRAPH et MYUNIT.
    Dans ma source TPU (myunit) j'utilise les librairies DOS, CRT.

    Apres compilation j'obtient 39.7 ko.


    Or, dans mon unité, la seule fonction nécessaire de la librairie CRT, est "readkey". j'ai donc remplacé cette fonction par le code ASM :

    CONST ScanCode : BYTE = 0;

    FUNCTION ReadKey : CHAR; Assembler;
    Asm
    MOV AL, ScanCode { sauve l'ancien ScanCode pour vérification}
    MOV ScanCode,0 { vide l'ancien ScanCode }
    OR AL, AL { l'ancien ScanCode est-il nul? }
    JNE @end { non. ScanCode est transmis }
    XOR AH, AH { on met AH à 0 }
    INT $16 { on lit le caractère }
    OR AL, AL { vaut-il 0? }
    JNE @end { non. Ce n'est pas un caractère étendu }
    MOV ScanCode, AH { oui. C'est un caractère étendu }
    @end:
    END;

    Donc maintenant mon code source principale contient donc les librairies dos, crt, graph et myunit.
    Et mon code de myunit contient dos.

    Après compilation, j'obtient 38.0 ko.


    Mon exe a donc perdu 1.7ko alors que la librairie CRT est tjrs utilisée dans le code principale.

    Conclusion :
    Les librairies sont ajoutées entierement à la compilation, avec TP7 ?
    Les librairies sont ajoutées autant de fois qu'elles sont nécessaire (ici 2 fois : 1 fois dans le main, et 1 fois dans le tpu) ?





    Source du code asm : http://membres.lycos.fr/jmy51/opti/opti.htm




    Voila

  9. #9
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Bon j'ai fait de mon côté des tests (avec la version 7.01 de TP) : voici les résultats :

    - compilation d'un "hello world":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    begin
    write('hello world');
    readln;
    end.
    Résultat : 3864 octets;

    - compilation d'un "hello world" avec crt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    uses crt;
    begin
    write('hello world');
    readln;
    end.
    Résultat : 6479 octets;

    -compilation d'un "hello world" avec crt et readkey:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    uses crt;
    begin
    write('hello world');
    readkey;
    end.
    Résultat : 6463 octets.

    On remarque donc que l'ajout de l'unité crt fait augmenter le code de approximativement 2600 octets. En supposant que le code des fonctions readln et readkey soit très proche (à quelques octets près), on peut admettre dans ce cas ci, que l'ajout de l'unité crt fait grossir le code de 2600 octets. On peut donc admettre que seules les procédures employées dans le code sont ajoutées lors de l'édition de liens. Cependant le seul ajout de l'unité crt fait grossir le code de quelques octets, même si aucune procédure de crt est utilisée (cas n°2) : le contenu ajouté est inconnu pour ma part... (peut-être des variables telles que IOresult et des constantes). Voilà c'est tout ce que je peux en dire !

    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  10. #10
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Le code est plus de 1500 octets moindre avec cette routine qu'avec celle de l'unit CRT. Ceci est dû principalement au fait que les différentes initialisations ne sont pas faites.
    Je viens de faire un tour sur le site que tu donnes, et voilà ce que j'y ai lu après le code asm de readkey... Ceci explique la perte de tes 1.7ko... Ceci prouve aussi que les unités ne sont ajoutées qu'une seule fois, puisque la perte d'octets est due au remplacement de readkey et non pas à la suppression de crt dans ton unité... Les initialisations de crt ne se font donc qu'une seule fois (c'est logique dans le cas de variables et de constantes...)
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14
    Points : 6
    Points
    6
    Par défaut 36.5 ko ....encore 5ko a perdre :p
    Ok, merci pour tes precisions.


    Un p'tit reply juste pour ajouter des fonctions ASM que j'ai utilisé, peut etre serviront elles a d'autres que moi !




    implementation
    var
    screen_page : byte;
    screen_width: byte;

    procedure gotoXY (x,y:integer);
    begin
    ASM
    {GOTORC proc ;position cursor according to DH, DL}
    DEC X {Pascal from 1, bios from 0}
    DEC Y
    MOV AH, $02 { ;BIOS service "position cursor"}
    MOV BH, screen_page { ;page 0 or as set by clearscreen}
    MOV DH, BYTE PTR Y { ;row and column are passed by caller }
    MOV DL, BYTE PTR X
    INT $10 {;call BIOS video services}
    END; {asm}
    end;{gotoRC endp}

    procedure clrScr; { proc ;clear screen, store page and segment address}
    label done;
    begin
    {;Test video mode, change pageseg for colour if necessary}
    ASM
    MOV AH, $0F { ;read video mode }
    INT $10 { ;Call BIOS }
    mov Screen_page, bh { information enabling us to write directly}
    mov Screen_width,ah { ; to video memory}
    CMP AL,7 {AL is mode, is it monochrome?}
    JA DONE {probably graphics, do nothing }

    MOV AX, $0600 { CLEAR SCREEN function, all lines}
    MOV BH,TextAttr {black bkgd, white chars unless changed}
    MOV CX, 0 {;upper left }
    MOV DH,24 {;assume 25 lines }
    MOV DL,screen_width
    dec dl
    INT $10 { call BIOS video services}
    end; {asm}
    {; position cursor at upper left}
    GotoXY(1,1);
    done:
    END; {clearScreen endp}

    j'ai donc pu "virer" la crt et ajouté ses fonctions dans ma librairie....j'ai donc perdu 1.5ko !

    Me voila a 36.5ko, il faut que je passe sous la barre des 32ko ....

    A noter que je n'ai besoin de la librairie dos uniquement dans myunit pour faire un GetTime et un GetDate ..... je vais donc essayer de trouver leur code ASM respectif


    Voili voilou...

    La page ou j'ai choppé les fonctions ASM pour finir : http://cs.ubishops.ca/ljensen/simulation/pascal/usebios.pas

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Si vous voulez faire des versions lite des librairies,


    aller faire un tour ici : http://www-user.tu-chemnitz.de/~ngn/tp70/source/


    ya pas mal de fonction retranscrits en ASM !

  13. #13
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 944
    Points : 59 431
    Points
    59 431
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Juju_41
    Je tiens à préciser que TP6 inclut la totalité des unités chargées dans l'éxectuable et non les quelques fonctions utilisées
    Désolé, mais il faut nuancer cette affirmation : TOUS les compilateurs Turbo Pascal utilisent l'édition de liens intelligente afin d'éliminer le code inutile lorsque l'exécutable est créé sur disque.

    Par contre, l'édition de liens intelligente est désactivée pour les compilations à destination de la mémoire.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  14. #14
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Bon, alors pour Crt, une petite explication.

    Tu inclus Crt dans ta clause uses, et pourtant tu n'utilises aucun de ses fonctions.
    Mais alors, d'où viennent ces octets dissidents ?

    De pas très loin ! A partir du moment où une unité est incluse dans une clause uses, sa aprtie initialisation est automatiquement exécutée au lancement du programme.

    Or l'unité Crt est écrite comme ceci à la fin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    begin
      Initialize;
      AssignCrt(Input); Reset(Input);
      AssignCrt(Output); Rewrite(Output);
    end.
    Tu auras remarqué le superbe appel à la procédure Initialize qui, entre autre, permet de faire fonctionner la procédure Delay (c'est d'ailleurs lors de cette initalisation que se produit le bug de l'erreur 200 pour un TP7 non patché).

    Pas besoin de chercher très loin donc.

    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

Discussions similaires

  1. Utilisation de quelques fonctions XML
    Par kanzarih dans le forum Langage
    Réponses: 2
    Dernier message: 28/07/2009, 12h05
  2. [LG]Utilisation de la fonction time
    Par kmitz dans le forum Langage
    Réponses: 4
    Dernier message: 08/04/2005, 13h05
  3. Utilisation de la fonction de déploiement
    Par mchicoix dans le forum XMLRAD
    Réponses: 4
    Dernier message: 01/03/2005, 14h35
  4. [LG]Utilisation de la fonction Random
    Par chloe95 dans le forum Langage
    Réponses: 1
    Dernier message: 01/03/2005, 14h20
  5. Utilisation de la fonction qsort
    Par Jsmeline dans le forum C
    Réponses: 8
    Dernier message: 28/01/2005, 12h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo