sous-chaîne – c code d’assemblage en ligne

J’écris un code qui obtient la sous-chaîne d’une chaîne avec gcc inline assembly. mais toujours avoir le problème quand je veux obtenir la sous-chaîne dont la longueur est 8. voici le code

static inline char * asm_sub_str(char *dest, char *src, int s_idx, int edix) { __asm__ __volatile__("cld\n\t" "rep\n\t" "movsb" : :"S"(src + s_idx), "D"(dest), "c"(edix - s_idx + 1) ); return dest; } int main(int argc, char *argv[]) { char my_ssortingng[STRINGSIZE] = "abc defghij"; char asm_my_sub_ssortingng[STRINGSIZE]; int sidx,eidx; sidx = 0; eidx = 5; char *d1 = asm_sub_str(asm_my_sub_ssortingng, my_ssortingng, sidx, eidx); printf("d1[%d-%d]: %s\n",sidx, eidx, d1); sidx = 0; eidx = 7; d1 = asm_sub_str(asm_my_sub_ssortingng, my_ssortingng, sidx, eidx); printf("d1[%d-%d]: %s\n",sidx, eidx, d1); sidx = 0; eidx = 9; d1 = asm_sub_str(asm_my_sub_ssortingng, my_ssortingng, sidx, eidx); printf("d1[%d-%d]: %s\n",sidx, eidx, d1); } 

voici la sortie

 d1[0-5]: abc de d1[0-7]: abc defg? d1[0-9]: abc defghi 

une idée?????

Merci pour votre réponse. Voici le code c de la sous-chaîne et j’ai oublié de mettre fin à la chaîne. Merci cactus et bbonev! Souhaitez que quelqu’un d’autre puisse apprendre de ce fil.

 static inline char * sub_str(char *dest, char *src, int s_idx, int edix) { int length = edix - s_idx + 1; int i; for(i = 0; i < length; i++) { *(dest + i) = *(src + s_idx + i); } *(dest + length) = '\0'; return dest; } 

Je suppose que cela ne fonctionne pas parce que le code d’assembly ne met pas 0 fin au tampon de résultat.

Je préférerais toujours la sémantique de sous-chaîne avec position de départ et nombre au lieu de deux positions. Les gens pensent peu plus facile en ces termes.

Il n’est pas nécessaire de renvoyer une valeur de cette fonction.

 static inline void asm_sub_str(char *dest, char *src, int s_idx, int count) { __asm__ __volatile__("cld\n" "rep\n" "movsb\n" "xor %%al,%%al\n" "stosb\n" : :"S"(src + s_idx), "D"(dest), "c"(count) ); } 

EDIT: Notez que cette implémentation est assez suboptimale bien qu’elle soit écrite en assembleur. Pour une architecture particulière, l’alignement de la mémoire et la taille des mots sont importants pour la rapidité et la meilleure façon de faire la copie consiste à aligner les mots de la taille de la machine. Commencez par copier un par un les mots de la taille 1, puis copiez la grande partie de la chaîne en mots et terminez le dernier mot jusqu’au dernier octets de la taille du mot.

Je prends la question comme un excersize dans un assemblage en ligne et des parameters transmis, et non comme le meilleur moyen de copier des chaînes. Avec les compilateurs C modernes, on s’attend à ce qu’un code plus rapide soit généré avec -O2.