begin process at 2012 05 25 11:55:37
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive Assembleur

 > 

Archives

 > 

c, c++ et asm

 > 

Peut on mieux faire ?


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Peut on mieux faire ?

samedi 18 février 2006 à 11:46:53 | Peut on mieux faire ?

spiky31

Membre Club
Bonjour Voila j'ai commencé ce matin a programmer en assembleur intel et j'aurais voulu avoir votre avis (Je me considére pas vraiment comme un noob vu que j'ai fais beaucoup de programmes en assembleur 68000 mais bon ...) : J'ai fait une version de "strcpy" en assembleur quoique ce n'est pas mon but final (heureusement !!) mais c'est déja un début ... voici le code : __declspec(naked) void __fastcall myStrCpy(char *dest,char *src) { __asm { mov [esp - 4],eax mov al,byte ptr[edx] mov byte ptr[ecx],al or al,al jnz short L1 mov eax,[esp - 4] ret 0 L1 : mov [esp - 8],esi xor esi,esi L2 : inc esi mov al,byte ptr[edx + esi] mov byte ptr[ecx + esi],al or al,al jnz short L2 mov esi,[esp - 8] mov eax,[esp - 4] ret 0 } } qu'en pensez vous ? peut on l'améliorer ? Merci d'avance
samedi 18 février 2006 à 21:00:20 | Re : Peut on mieux faire ?

BruNews

Administrateur CodeS-SourceS

pourquoi toucher à ESI ???


#ifndef MCRASM_H
#define MCRASM_H

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

BNINLINE char* bnstrcpy(char *dst, char *src) // return ptr sur NULL final
{
  __asm {
    mov   eax, dst
    mov   ecx, src
    dec   eax
LcpyLoop:
    mov   dl, [ecx]
    inc   eax
    inc   ecx
    mov   [eax], dl
    or    dl, dl
    jz    short LcpyOut
    mov   dl, [ecx]
    inc   eax
    inc   ecx
    mov   [eax], dl
    or    dl, dl
    jz    short LcpyOut
    mov   dl, [ecx]
    inc   eax
    inc   ecx
    mov   [eax], dl
    or    dl, dl
    jnz   short LcpyLoop
LcpyOut:
  }
}

#endif

un strcpy doit être inliné (comme une macro), un appel de fonction coute cher.
bnstrcpy() retourne pointeur sur fin de copie, permet chainage sans reparcourir la chaine. C'est autrement moins couillon que strcpy qui retourne ce qu'on lui donne et donc qu'on avait déjà.

ciao...
[ Lien ]
BruNews, MVP VC++

samedi 18 février 2006 à 21:32:25 | Re : Peut on mieux faire ?

patatalo

Membre Club Administrateur CodeS-SourceS
salut,

mov [esp - 4],eax

acceder a une memoire non allouée est a mon avis une erreur meme si le mode protégé est sensé ne pas toucher a la pile utilisateur.

@++
dimanche 19 février 2006 à 09:08:41 | Re : Peut on mieux faire ?

BruNews

Administrateur CodeS-SourceS
Ecrire sous ESP ne pose aucun problème tant qu'on ne fera pas un 'call' ou truc de ce genre faisant bouger ESP, c'est plus performant que 'push pop' mais bien entendu à réserver au mode protégé.

ciao...
[ Lien ]
BruNews, MVP VC++
dimanche 19 février 2006 à 12:51:53 | Re : Peut on mieux faire ?

patatalo

Membre Club Administrateur CodeS-SourceS
salut, et a ne surtout pas utiliser dans un kernel. @++
dimanche 19 février 2006 à 13:14:11 | Re : Peut on mieux faire ?

spiky31

Membre Club
Merci pour toutes ces précisions, je viens encore d'apprendre quelques trucs ... j'ai juste une petite question BruNews : pourquoi ton code plutot que celui la : BNINLINE char* bnstrcpy(char *dst, char *src) // return ptr sur NULL final { __asm { mov eax, dst mov ecx, src dec eax LcpyLoop: mov dl, [ecx] inc eax inc ecx mov [eax], dl or dl, dl jnz short LcpyLoop } } il semble fonctionner pareil ... ??
dimanche 19 février 2006 à 13:24:18 | Re : Peut on mieux faire ?

BruNews

Administrateur CodeS-SourceS
Je déroule la boucle 3 fois donc 1 saut de code sur 3, appréciable en perf sur les longues chaines.

ciao...
[ Lien ]
BruNews, MVP VC++
dimanche 19 février 2006 à 13:37:56 | Re : Peut on mieux faire ?

spiky31

Membre Club
Alors je viens de faire quelque tests et effectivement la version déroulée est beaucoup plus rapide que la version non déroulée c'est impressionant !!
dimanche 19 février 2006 à 14:08:05 | Re : Peut on mieux faire ?

patatalo

Membre Club Administrateur CodeS-SourceS
aligner les chaines sur 4 octets permet de faire une lecture DWORD et de travailler sur le registre ensuite. @++
dimanche 19 février 2006 à 15:06:57 | Re : Peut on mieux faire ?

BruNews

Administrateur CodeS-SourceS
Quand on chaine des trucs, on ne choisit pas la position donc alignement inconnu.

ciao...
[ Lien ]
BruNews, MVP VC++

1 2

Cette discussion est classée dans : mov, byte, al, esi, esp


Répondre à ce message

Sujets en rapport avec ce message

Routine inversée... [ par viva ] salut,peutons inversé cette routine. je débute en asm je sais lire ces instructions mais j'ai des limites. MOV ESI, valeur     MOV BL,BYTE PTR DS:[ESI Assembleur et langage C sous Linux [ par lapinfroid ] Bonjour a tous ,avant toute chose , je tiens a preciser que j en ai aucune notion d'assembleur Je pratique plutot le C et le JavaDans un programme C , tableau avec 8086!help me [ par ASBYoucef ] bonsoir!j'ai fait un programme qui saisie un tableau,puis il cherche le maximum,mais le problème c'est que il donne une résulata fausse,il donne la de prog tri en EMU8086 [ par joneskech ] bsr,j ecrit ce programme pour le tri en EMU8086 ;mais contient des erreures pouvez_vouz m aider?#make_exe#data segment tab db 1 dup (1,9,2,6,3,5)data mon programme bloque [ par rhumsek ] slt j'ai améliore mon programme mais il provoque une erreure lorsdu calcul de la somme des entiers saisi (sommeentier)POURTANT il exécute bien les de Recuperer le mode Video [ par FearBlue ] Slt a tous !!!!!!!Je souhaite recupérer le mode video g lus dans une doc ca :Cette fonction retourne le numéro de code du mode vidéo en cours et tient Assembleur et tableau + linux + bof [ par flocic ] Bonjour, J'ai un petit pb de comprehension, j'ai un programme qui deborde au bout 44 octet  à cause d'un depassement d ela taille du tableau. Mais ce ecrire dans un fichier avec assembleur [ par karimusthb ] Bonjour, j'essaye d'ecrire dans un fichier avec assembleur,[MASM] le probleme c que en resultat j'ai un fichier ecrit en caractére ASCII comment faire assembleur [ par rojbeni ] bonjour tous,comment  faire pour  saisie une suite de nombre  a stocker  dans un tableau   . le nombre maximum de nombre que l'on peut saisir est de 1 fatal error LNK1190 [ par WildChild54 ] Bonjour à tous!Eh bien voilà, je voudrais créer un petit programme affichant l'heure (je sais il y en a déjà plusieurs qui en ont parlé ici) mais j'ai


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,451 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales