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

Free Pascal Discussion :

[Linux] Limitation Inline Assembler


Sujet :

Free Pascal

  1. #1
    Invité
    Invité(e)
    Par défaut [Linux] Limitation Inline Assembler
    Bonjour,

    je me heurte à une limitation de l'utilisation de l'assembleur sous Intel en FP avec l'utilisation de ce code que l'on trouve dans le tuto de Bruno Guérangé "Utilisation de l'assembleur en ligne avec Delphi" III-E-6. Chaînes courtes, limitation qui à priori n'est pas rencontrée avec Delphi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function SommeChaine(A,B:ShortString):ShortString;
    begin
     {$ASMMODE intel}
      asm
      PUSH EDI
      PUSH ESI
      MOV  EDI,ECX
      MOV  CL,byte ptr [EAX]   {<-- Oups !}
      ADD  CL,byte ptr [EDX]
    [...]
    Au moment du calcul de la longueur de A, cela plante :
    Constant references expressions with constants only are not allowed (in all cases they do not work in protected mode, e.g. under linux i386). Examples:
    mov al,byte ptr [’c’] -- not allowed.
    mov al,byte ptr [100h] -- not allowed.
    (This is due to the limitation of the GNU Assembler).
    Source : Extrait de la Doc Free Pascal Intel syntax
    Pas moyen de contourner le problème ?

    Merci. Cordialement.
    Gilles
    Lazarus 0.9.31-FPC 2.6.1- Win et Ubuntu /Intel 32 bits.
    Dernière modification par Invité ; 21/02/2012 à 18h41.

  2. #2
    Responsable Pascal, Lazarus et Assembleur


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

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 996
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Ca me semble bizarre comme limitation de l'assembleur, c'est une instruction mov qui ne devrait poser aucun problème. Une idée : remplacer les instructions par le code machine correspondant, via une directive db ?
    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]

  3. #3
    Responsable Pascal, Lazarus et Assembleur


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

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 996
    Billets dans le blog
    2
    Par défaut
    Voilà avec le code machine inclus :
    Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Asm
      PUSH EDI
      PUSH ESI
      MOV  EDI,ECX            ; DI pointe sur le résultat
      db   8A08h              ; MOV  CL,Byte ptr [EAX] // Longueur de A
      db   020Ah              ; ADD  CL,Byte ptr [EDX] // Longueur de B
      db   8A0Ah              ; MOV  Byte ptr[EDI],CL  // Longueur totale
      INC  EDI                ; Prise en compte longueur
      MOV  ESI,EAX            ; ESI pointe sur A
      INC  ESI
      XOR  ECX,ECX            ; ECX = longueur de A
      db   8A08h              ; MOV  CL,Byte Ptr [EAX]
      REP  MOVSB              ; Copie de A
      MOV  ESI,EDX            ; ESI pointe sur B
      INC  ESI
      db   8A0Ah              ; MOV  CL,Byte Ptr [EDX] // ECX = longueur de B
      REP  MOVSB              ; Copie de B
      POP  EDI
      POP  ESI
    End;
    N.B. Le registre CL étant présent dans l'instruction, pas besoin d'ajouter le Byte ptr.
    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]

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/12/2010, 19h54
  2. [gcc] Fichier linux/limits.h introuvable
    Par Trap D dans le forum SUSE
    Réponses: 2
    Dernier message: 21/09/2009, 21h48
  3. Réponses: 2
    Dernier message: 16/07/2007, 17h31
  4. limitation connexion serveur linux
    Par therealvulcain dans le forum Réseau
    Réponses: 6
    Dernier message: 14/09/2006, 17h00
  5. Limiter les tentatives d'ouverture d'une session linux
    Par steven51 dans le forum Administration système
    Réponses: 3
    Dernier message: 25/04/2006, 08h50

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