Précédent   Forum du club des développeurs et IT Pro > Autres langages > Pascal > Free Pascal
Free Pascal Le compilateur Pascal multiplateforme
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 21/02/2012, 18h10   #1
selzig
Membre émérite
 
Homme Gilles
Enseignant
Inscription : novembre 2006
Messages : 808
Détails du profil
Informations personnelles :
Nom : Homme Gilles
Âge : 54
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : novembre 2006
Messages : 808
Points : 956
Points : 956
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 :
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 :
Citation:
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.
selzig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2012, 21h47   #2
Alcatîz
Responsable Pascal

 
Avatar de Alcatîz
 
Homme Jean-Luc Gofflot
Ressources humaines
Inscription : mars 2003
Messages : 5 510
Détails du profil
Informations personnelles :
Nom : Homme Jean-Luc Gofflot
Âge : 46
Localisation : Belgique

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

Informations forums :
Inscription : mars 2003
Messages : 5 510
Points : 39 358
Points : 39 358
Envoyer un message via ICQ à Alcatîz Envoyer un message via MSN à Alcatîz Envoyer un message via Yahoo à Alcatîz Envoyer un message via Skype™ à Alcatîz
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
Tutoriels, exercices, FAQ, sources, compilateurs, outils, livres Pascal
Mes tutoriels et sources Pascal
FAQ Assembleur

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]
Alcatîz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2012, 21h14   #3
Alcatîz
Responsable Pascal

 
Avatar de Alcatîz
 
Homme Jean-Luc Gofflot
Ressources humaines
Inscription : mars 2003
Messages : 5 510
Détails du profil
Informations personnelles :
Nom : Homme Jean-Luc Gofflot
Âge : 46
Localisation : Belgique

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

Informations forums :
Inscription : mars 2003
Messages : 5 510
Points : 39 358
Points : 39 358
Envoyer un message via ICQ à Alcatîz Envoyer un message via MSN à Alcatîz Envoyer un message via Yahoo à Alcatîz Envoyer un message via Skype™ à Alcatîz
Voilà avec le code machine inclus :
Code asm :
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
Tutoriels, exercices, FAQ, sources, compilateurs, outils, livres Pascal
Mes tutoriels et sources Pascal
FAQ Assembleur

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]
Alcatîz est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 12h45.


 
 
 
 
Partenaires

Hébergement Web