Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2715 connectés 

  FORUM HardWare.fr
  Programmation
  ASM

  [ASM+C] Chaines de caractere

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[ASM+C] Chaines de caractere

n°1701424
GreGoireP
Posté le 12-03-2008 à 23:57:48  profilanswer
 

Bonjour !
Imaginons que j'écrive:
 
char essai[100]="Hello world";
 
Plus bas, dans de l'ASM (integré au code C), est t-il possible à partir de l'adresse (essai) par exemple de parcourir les caractères un à un (jusqu'au '\0' ici rajouté systématiquement) afin d'appliquer un quelquonque traitement écrit directement en assembleur à chaque caractere ?
La doc de l'ASM inline est assez obscure et j'avoue qu'à part des entiers je n'arrive pas a voir comment manipuler quoi que ce soit ^^
 
 
Merci!
Grégoire

mood
Publicité
Posté le 12-03-2008 à 23:57:48  profilanswer
 

n°1701457
Ace17
Posté le 13-03-2008 à 06:58:47  profilanswer
 

Oui, c'est possible, sinon l'assembleur inline ne serait pas d'une grande utilite...
Deja, il faut que tu nous dises quel compilateur tu utilises. Visual? gcc?
"a part des entiers je n'arrive pas a voir comment manipuler quoi que ce soit" -> Ca tombe bien, t'as besoin de rien d'autre :)
Poste deja un bout de code, qu'on parte pas de zero.


Message édité par Ace17 le 13-03-2008 à 06:58:59
n°1701824
GreGoireP
Posté le 13-03-2008 à 15:58:52  profilanswer
 

En fait j'y suis arrivé depuis hier j'ai d'autres problèmes :)
J'utilise GCC sinon pour info
 
Et pourquoi vous dites tous que le C inline est pas utile ? Par exemple si j'écris:
 

Code :
  1. void strtolowerASM(char * chaine) {
  2.         __asm__ __volatile__ (
  3.                 "movl %0, %%ebx;"
  4.                 "DEB: cmpb $0, (%%ebx);"
  5.                 "je FIN;"
  6.                 "cmpb $65, (%%ebx);"
  7.                 "jl NEXT;"
  8.                 "cmpb $90, (%%ebx);"
  9.                 "jg NEXT;"
  10.                 "orb $32, (%%ebx);"
  11.                 "NEXT: addl $1, %%ebx;"
  12.                 "jmp DEB;"
  13.                 "FIN:;"
  14.                 : : "g" (chaine) );
  15. }


 
Je vais 8 fois plus vite que si j'écris:
 

Code :
  1. void strtolowerC(char * chaine) {
  2.         int i;
  3.         for (i=0; i<strlen(chaine); i++)
  4.                 if (chaine[i]>='A' && chaine[i]<='Z')
  5.                         chaine[i]|=32;
  6. }


 
Alors ne criez pas "Ouais mais heu STRTOLOWER ça existe dans telle biblio", je m'en fou c'est juste un exemple :p
 
Sinon est t-il possible de manipuler des nombres flottants ?
 
 
Greg

n°1702003
Ace17
Posté le 13-03-2008 à 19:03:41  profilanswer
 

Heu ... juste comme ca, t'as bien active les optimisations sur ton compilo?

n°1702068
tpierron
Posté le 13-03-2008 à 21:02:51  profilanswer
 

Arf, et ton code C n'est pas très optimisé. Genre le strlen(), il est certainement évalué à chaque itération. Passer par un pointeur plutôt qu'un déréférencement de tableau, pourrait encore économiser quelques cycles.
 
Genre je me suis amusé avec un petit bench : 10240 chaines de 1M sur un Core Duo@2.00GHz
 
ASM : 26s (ta version)
C O0: 72s
C 02: 24s
C O3: 17s
 
En C, j'ai légèrement modifié ton algo :

Code :
  1. void strtolowerC(char * chaine)
  2. {
  3. char * p;
  4. for (p = chaine; *p; p ++)
  5.  if ('A' <= *p && *p <= 'Z') *p |= 32;
  6. }


Message édité par tpierron le 13-03-2008 à 21:05:53
n°1702069
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 13-03-2008 à 21:03:44  profilanswer
 

peine de mort pour la syntaxe AT&T

n°1702071
FlorentG
Unité de Masse
Posté le 13-03-2008 à 21:11:20  profilanswer
 

Harkonnen a écrit :

peine de mort pour la syntaxe AT&T


+1. Ca rend l'assembleur difficilement lisible et compréhensible. Faudrait presque y mettre des commentaires :(

n°1702081
GreGoireP
Posté le 13-03-2008 à 21:40:45  profilanswer
 

Mais je comprends pas, vous voulez dire que la syntaxe C est déja suffisament optimisé coté puissance de calcul pour ne même pas avoir à réécrire le tout en assembleur ? Je veux dire, apprendre l'assembleur aujourd'hui ça ne sert donc strictement à rien (A part les acces de bas niveau) ?

n°1702082
Joel F
Real men use unique_ptr
Posté le 13-03-2008 à 21:41:14  profilanswer
 

GreGoireP a écrit :

Mais je comprends pas, vous voulez dire que la syntaxe C est déja suffisament optimisé coté puissance de calcul pour ne même pas avoir à réécrire le tout en assembleur ? Je veux dire, apprendre l'assembleur aujourd'hui ça ne sert donc strictement à rien (A part les acces de bas niveau) ?


 
ca sert à comprendre ce qui se passe et donc à pas ecrire du C de merde.

n°1702084
GreGoireP
Posté le 13-03-2008 à 21:43:42  profilanswer
 

Oui ok je vois :)
 
Et pour cette histoire d'optimisation du code par GCC, bien sûr je suis conscient que y'a des limites mais y'a vraiment des trucs à activer ou d'autres programmes utilisables pour faire ce genre de chose ?

mood
Publicité
Posté le 13-03-2008 à 21:43:42  profilanswer
 

n°1702087
Joel F
Real men use unique_ptr
Posté le 13-03-2008 à 21:47:36  profilanswer
 

-O3 est le srict minimum

n°1702092
GreGoireP
Posté le 13-03-2008 à 21:53:34  profilanswer
 

Ok, mais, toujours d'un point de vue optimisation automatique, y'a quelque chose d'autre à faire que -03 ?

n°1702099
Joel F
Real men use unique_ptr
Posté le 13-03-2008 à 22:14:43  profilanswer
 

ca depend de ce que tu cherche à faire. Y a pas de miracle, gcc fait ce qu'il peut mais tu gagneras trjrs à optimiser proprement à la main les choses qui comptent : déroulage de boucle, tiling mémoire, alignement etc


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  ASM

  [ASM+C] Chaines de caractere

 

Sujets relatifs
reconnaitre la valeur d'un caractère sélectéMultiplication ASM
javascript: problème avec des chaines qui contiennent du php[Shell] Insérer un caractère
récupérer une partie d'une chaîne de caractère (en partant de la fin)tableau d'une chaine de caractere
[Excel] Supprimer un caractère d'un texteproblème encodage caractére avec htmlspecialchars()
problème encodage caractéretraitement de chaines de caractères (débutant)
Plus de sujets relatifs à : [ASM+C] Chaines de caractere


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR