[ASM+C] Chaines de caractere

Chaines de caractere [ASM+C] - ASM - Programmation

Marsh Posté le 12-03-2008 à 23:57:48    

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

Reply

Marsh Posté le 12-03-2008 à 23:57:48   

Reply

Marsh Posté le 13-03-2008 à 06:58:47    

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
Reply

Marsh Posté le 13-03-2008 à 15:58:52    

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

Reply

Marsh Posté le 13-03-2008 à 19:03:41    

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

Reply

Marsh Posté le 13-03-2008 à 21:02:51    

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
Reply

Marsh Posté le 13-03-2008 à 21:03:44    

peine de mort pour la syntaxe AT&T

Reply

Marsh Posté le 13-03-2008 à 21:11:20    

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 :(

Reply

Marsh Posté le 13-03-2008 à 21:40:45    

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) ?

Reply

Marsh Posté le 13-03-2008 à 21:41:14    

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.

Reply

Marsh Posté le 13-03-2008 à 21:43:42    

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 ?

Reply

Marsh Posté le 13-03-2008 à 21:43:42   

Reply

Marsh Posté le 13-03-2008 à 21:47:36    

-O3 est le srict minimum

Reply

Marsh Posté le 13-03-2008 à 21:53:34    

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

Reply

Marsh Posté le 13-03-2008 à 22:14:43    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed