Accueil > Forum > > > > [EXPERTS]optimisation du c/asm
[EXPERTS]optimisation du c/asm
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
|
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
|
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ée 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
Savoir la compilation (Décompilation si possible ^^) [ par Clad38 ]
Bonsoir à tous, Je sais pas si je poste dans la bonne catégorie mais j'ai chercher sans succès. J'ai plusieurs fichiers à décompilé, mais je sais pa
ASM + C++, Aidez-moi SVP :D [ par belette321 ]
Bonjour, voilla j'esseil de faire un anti-hack mais j'optien une erreur lors de se code... : [code=cpp]__asm{ mov eax, WriteProcessMemory; IAT mov
[Aide] Repackeur EPK/EIX [ par slam2 ]
Bonjour, Je requière votre aide étant tout nouveau dans le milieu de la programmation C# & C++ . Afin de mener à bien mon projet, dans le but de pouv
lecture d'une chaine au clavier :probléme d'execution! [ par infofst ]
Bonjour, je suis en train d'écrire un programme qui fait des opérations sur une date saisie au clavier. la lecture de date est en language assembleu
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));->
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
Livres en rapport
|
Derniers Blogs
[WP7] DYNAMICALLY CHANGE STARTUP PAGE[WP7] DYNAMICALLY CHANGE STARTUP PAGE par KooKiz
Let's say that you want to allow the user to customize the startup page of your application. You can easily change the startup page by editing the 'NavigationPage' attribute in the manifest file. But the manifest cannot be modified once the applicatio...
Cliquez pour lire la suite de l'article par KooKiz SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|