Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : [EXPERTS]optimisation du c/asm [ Archives / Divers ] (MrdJack)

lundi 8 mai 2006 à 22:14:13 | [EXPERTS]optimisation du c/asm

MrdJack

Bonsoir,
je suis en train de me renseigner sur le c et l'asm niveau vitesse d'execution.
en detail je me demande comment créer un code en c pour que sont listing asm soit le plus optimisé et un probleme de compréhension est alors survenu :
je me suis basé sur la fonction strlen() de la stl. j'ai édité son fichier asm (strlen.asm) afin de voir comment c'est organisé en asm.
dans ce fichier il y a aussi un code en c equivalent. mais apres avoir essayé ce code alternatif, je me suis rendu compte qu'il etait moins rapide que celui en assembleur.
en poussant mes recherches, j'ai regardé le listing du code asm de la fonction strlen écrite en c (l'alternative) et à ma grande surprise, le listing asm de cette fonction est plus court en nombre de ligne que le code asm du fichier strlen.asm ( sans compter la sauvegarde des registres et tout qui doit etre équivalente)
le truc dingue c'est que cette fonction qui est plus lente que celle codée en asm prend moins de ligne.

voilà les deux résultats :
CODESEG
        public  strlen
strlen  proc
        .FPO    ( 0, 1, 0, 0, 0, 0 )
string  equ     [esp + 4]
        mov     ecx,string              ; ecx -> string
        test    ecx,3                   ; test if string is aligned on 32 bits
        je      short main_loop
str_misaligned:
        ; simple byte loop until string is aligned
        mov     al,byte ptr [ecx]
        inc     ecx
        test    al,al
        je      short byte_3
        test    ecx,3
        jne     short str_misaligned
        add     eax,dword ptr 0         ; 5 byte nop to align label below
        align   16                      ; should be redundant
main_loop:
        mov     eax,dword ptr [ecx]     ; read 4 bytes
        mov     edx,7efefeffh
        add     edx,eax
        xor     eax,-1
        xor     eax,edx
        add     ecx,4
        test    eax,81010100h
        je      short main_loop
        ; found zero byte in the loop
        mov     eax,[ecx - 4]
        test    al,al                   ; is it byte 0
        je      short byte_0
        test    ah,ah                   ; is it byte 1
        je      short byte_1
        test    eax,00ff0000h           ; is it byte 2
        je      short byte_2
        test    eax,0ff000000h          ; is it byte 3
        je      short byte_3
        jmp     short main_loop         ; taken if bits 24-30 are clear and bit
                                        ; 31 is set
byte_3:
        lea     eax,[ecx - 1]
        mov     ecx,string
        sub     eax,ecx
        ret
byte_2:
        lea     eax,[ecx - 2]
        mov     ecx,string
        sub     eax,ecx
        ret
byte_1:
        lea     eax,[ecx - 3]
        mov     ecx,string
        sub     eax,ecx
        ret
byte_0:
        lea     eax,[ecx - 4]
        mov     ecx,string
        sub     eax,ecx
        ret
strlen  endp
        end

puis :

; 18   : {
  00000    55         push     ebp
  00001    8b ec         mov     ebp, esp
  00003    83 ec 44     sub     esp, 68            ; 00000044H
  00006    53         push     ebx
  00007    56         push     esi
  00008    57         push     edi
  00009    8d 7d bc     lea     edi, DWORD PTR [ebp-68]
  0000c    b9 11 00 00 00     mov     ecx, 17            ; 00000011H
  00011    b8 cc cc cc cc     mov     eax, -858993460        ; ccccccccH
  00016    f3 ab         rep stosd
; 19   :    int length = 0;
  00018    c7 45 fc 00 00
    00 00         mov     DWORD PTR _length$[ebp], 0
$L1269:
; 20   :
; 21   :    while( *str++ )
  0001f    8b 45 08     mov     eax, DWORD PTR _str$[ebp]
  00022    0f be 08     movsx     ecx, BYTE PTR [eax]
  00025    8b 55 08     mov     edx, DWORD PTR _str$[ebp]
  00028    83 c2 01     add     edx, 1
  0002b    89 55 08     mov     DWORD PTR _str$[ebp], edx
  0002e    85 c9         test     ecx, ecx
  00030    74 0b         je     SHORT $L1270
; 22   :            ++length;
  00032    8b 45 fc     mov     eax, DWORD PTR _length$[ebp]
  00035    83 c0 01     add     eax, 1
  00038    89 45 fc     mov     DWORD PTR _length$[ebp], eax
  0003b    eb e2         jmp     SHORT $L1269
$L1270:
; 23   :
; 24   :    return( length );
  0003d    8b 45 fc     mov     eax, DWORD PTR _length$[ebp]
; 25   : }
  00040    5f         pop     edi
  00041    5e         pop     esi
  00042    5b         pop     ebx
  00043    8b e5         mov     esp, ebp
  00045    5d         pop     ebp
  00046    c3         ret     0

donc je piges pas pourquoi la premiere fonction est plus rapide mais plus grande alors que la deuxieme es tplus lente et plus petite
je sais deja que chaque compilo peut donner un code différent mais mon probleme de comprehension est basé sur la relation ligne de code par rapport à la vitesse ( je m'avance un peu mais peut etre parce que la premiere fonction prend 4B par 4B mais ca reste une supposition)

merci de m'éclairer sur le sujet.

PS je suis assez doué en c et un peu en asm (disont que je connais l'assembleur utilisé sur les automates programmables de telemecanique et de siemens. je connais les bases pour un programme com ou exe sous dos mis à part les interruptions qui sans une refférence me donne un mal de cranne ! le reste est assez similaire)


lundi 8 mai 2006 à 22:27:20 | Re : [EXPERTS]optimisation du c/asm

MuPuF

bah, tu devrais savoir que certaines commandes demandent plusieurs cycles pros, enfin il me semble
Enfin c'est la seule explication possible
Un connaisseur dans le coin ????

lundi 8 mai 2006 à 22:37:03 | Re : [EXPERTS]optimisation du c/asm

BruNews

Administrateur CodeS-SourceS
Réponse acceptée !
C'est clair, le plus court en code n'est pas le meilleur en performance.
Exemple: Je déroule la boucle 3 fois donc je n'effectue qu'un saut de code (jnz   short Llen1) sur 3.
La func du haut aspire par passe de 4 octets dès que la chaine est alignée sur 4, il y a donc code de 'tant que non aligné' avant.

Essaie ceci, devrait aller pas mal non plus.

#ifndef BNINLINE
#ifdef __cplusplus
#define BNINLINE inline
#else
#define BNINLINE __inline
#endif /* __cplusplus */
#endif

BNINLINE DWORD bnstrlen(char *psz)
{
  __asm {
    mov   eax, psz
Llen1:
    mov   dl, [eax]
    inc   eax
    test  dl, dl
    jz    short LlenOut
    mov   dl, [eax]
    inc   eax
    test  dl, dl
    jz    short LlenOut
    mov   dl, [eax]
    inc   eax
    test  dl, dl
    jnz   short Llen1
LlenOut:
    dec   eax
    sub   eax, psz
  }
}


ciao...
BruNews, MVP VC++

lundi 8 mai 2006 à 22:59:19 | Re : [EXPERTS]optimisation du c/asm

MrdJack

en effet je comprends mieux le systeme, et surtout que je vais me mettre direct à l'asm car on voit bien qu'en c c'est impossible à réaliser !!!
je crois bien que au final, mon code sera plus composé d'assembleur que de c visiblement

une petite question : dans la ligne de code mov   dl, [eax] les crochets signifie bien que l'on va chercher la valeur de la zone mémoire pointée par eax n'est-ce pas ?

sinon merci encore pour votre aide
@+



lundi 8 mai 2006 à 23:05:55 | Re : [EXPERTS]optimisation du c/asm

BruNews

Administrateur CodeS-SourceS
exact pour mov mais ce n'est pas toujours le cas.

lea  edx, [eax+eax*4]
ici pas d'accès mémoire mais simple opération arythmétique: edx = eax*5

ciao...
BruNews, MVP VC++



Cette discussion est classé dans : mov, byte, asm, eax, ecx


Répondre à ce message

Sujets en rapport avec ce message

ASM et C++ [ par sebastienbro ] Bonjour, j'aimerais savoir ce qui ne vas pas dans le code suivant. J'ai une erreur "error C2400: inline assembler syntax error in 'opcode'; found 'con optimiser un codes asm [ par sajid_morad ] salut tout le monde , j ai une parti du code en c++, que j ai voulu optimiser , le l ai reécri en asm , mai ça donne pas grand chose, si quelqu un pou petit pb de pointer [ par mirlaine ] en fait c tou simpleje cherche l 'équivalen à ca: LPCWSTR user LPBYTE *bufptr mov eax, [bufptr] mov eax, [eax] //LPUSER_INFO_0 mov eax, [e PB avec de l'ASM dans VC++ 6 .... [ par Foub12 ] Bonjour...Je programme sous VC++ 6 et j'ai trouvé sur Internet, la fonction suivante mais elle ne marche pas... Il compile parfaitement mais lors de l Secteur de boot : comment ordonner des commandes ??? [ par Foub12 ] Bonjour,j'ai une question qui me turlupine depuis un petit moment et j'aimerais bien connaître la réponse...Le secteur de boot (d'une disquette par ex [C + ASM] strchr(const char *s, char c): [ par Calak ] Voila, j'ai un petit probs...Je suis en train d'essayer de recoder des fonction de string.hmais j'ai un probs con (j'en suis sur -_- ) sur le strchrIl Code ASM dans projet CPP [ par FearBlue ] Slt a tous !!!$Je dev une appli en Cpp et je desire inclure de L'asm dedansJe compile avec gccVoici ce que je fais et ca fait grosse erreur :(:(:(:(   problèmes avec le registre ESP (C++ et ASM) [ par DeadlyPredator ] Bonjour, je voudrais créer une fonction permettant d'appeller des APIs sans avoir besoins de déclarer leur prototype ni en utilisant les .lib. Lorsque Macro : renvoyer une chaîne avec une virgule [ par rt15 ] Salut,Je cherche désespérément à faire une macro qui renverrait une chaîne comprenant deux éléments séparés par une virgule.printf(TO_STRING(a, b));-> Problème ac du inline asm [ par oceax ] Bonjour,je suis débutant en c++ et n'y connais pas encore énormément gd chose...Sur mon dernier programme (un keygen pr crack me que j'ai créé par mes


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,562 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.