djes a écrit :En regardant le code assembleur avec PureASM, je suis quand même surpris de la taille de la procédure (et de ses initialisations). L'opération en elle-même ne prend au pire que trois instructions, par contre le reste de la procédure (initialisation et restauration de la pile), plus d'une vingtaine, dont une boucle et deux sauts! Autant dire que parler d'optimisation dans ces conditions me laisse un peu... perplexe!
Je me demande si on ne pourrait pas inventer une nouvelle instruction de procedure dont on créerait entièrement le code, sans que pure ne le génére. On pourrait demander à Fred... On pourrait l'appeler ProcedureASM(params) par exemple.
C'est un des gros avantage d'écrire une librairie en asm (voire en C mais là je n'y connais que dalle) car PB ne permet pas de le faire directement.
Tu as remarqué, PB alloue de la place qur la pile pour toutes les variables et tous les paramètres; ensuite PB recopie l'ensemble des paramètres sur la pile puis initialise les variables locales à 0, le tout en ayant sauvegardé tous les registres sauf eax et edx. Ce n'est pas une critique, il faut bien avoir des règles.
Le code PB
Code : Tout sélectionner
; Procedure.b SignedBinaryToUnsigned(Byte.b)
JMP _EndProcedure0
_Procedure0:
PUSH ebx
PUSH ecx
PUSH ebp
PUSH esi
PUSH edi
MOV esi,esp
SUB esp,4
MOV eax,esp
MOV edx,eax
ADD edx,4
_ClearLoop0:
MOV dword [eax],0
ADD eax,4
CMP eax,edx
JNE _ClearLoop0
MOV eax, dword [esi+24]
MOV byte [esp+0],al
; ProcedureReturn Byte & $FF
MOVSX ebx,byte [esp]
AND ebx,255
MOV eax,ebx
JMP _EndProcedure1
; EndProcedure
XOR eax,eax
_EndProcedure1:
ADD esp,4
POP edi
POP esi
POP ebp
POP ecx
POP ebx
RET 4
_EndProcedure0:
et l'équivalent avec PureASMTools (intégré à PureASM) pour la génération du squelette asm
Code : Tout sélectionner
format MS COFF
public PB_SignedBinaryToUnsigned_ASM
; -------------------------------------------;
; Paramètres d'entrée ;
; -------------------------------------------;
; Byte.b
Byte equ esp+4
; -------------------------------------------;
; Section code ;
; -------------------------------------------;
section '.text' code readable executable
PB_SignedBinaryToUnsigned_ASM:
; **************************************************
; Mettez votre code asm perso après cette ligne
MOVSX eax,byte [Byte]
AND eax,255
; fin de la zone de votre code asm perso
; **************************************************
_Retour:
RET 4
J'espère que PureASMTools donnera envie à certains de faire des libs en asm (Bon, tout n'est pas parfait mais je travaille un peu dessus tous les jours, surtout la doc en ce moment)