BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 28 sept. 2004 à 19:09
C'est calcule par un algo infernal.
Je te send mon utilitaire qui te calculera tout cela.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 28 sept. 2004 à 18:58
Oui mais pourquoi cela fait il division par 10?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 28 sept. 2004 à 18:50
Vaut mieux faire un 'mul' que un 'div' si on connait le diviseur. Vois que dans le dwtoa de MASM32 c'est aussi fait de cette maniere, avec d'autres valeurs mais le but est toujours de mettre un mul au lieu d'un div.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 28 sept. 2004 à 18:22
cs_Nikro
Messages postés1Date d'inscriptionvendredi 24 septembre 2004StatutMembreDernière intervention26 septembre 2004 26 sept. 2004 à 00:45
Merci pour ces commentaires qui contriburont à m'orienter vers une meilleure vision des choses.
C'est ma première routine en assembleur, excepté le Hello World de prise en main.
J'essaie en fait de programmer un convertisseur multi-base pour me familiariser avec l'assembleur.
Visiblement ça prendra du temps, je le prendrai.
@++.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 25 sept. 2004 à 17:03
Cas typique de proc non optimisee qui ressemble fort a ce que produisait un vieux compilo C.*
A quoi sert l'empilage et depilage des 2 params ???
Ils ne sont lus qu'1 seule fois donc devaient etre passes en registres, 6 cycles de gagnes rien que la.
ToutEnMasm
Messages postés587Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 25 sept. 2004 à 16:43
salut,
La méthode de masm32 pour passer d'un DW a une chaine de caractere ascii, dwtoa
ToutEnMasm
; ---------------------------------------------------------------
; This procedure was originally written by Tim Roberts
;
; Part of this code has been optimised by Alexander Yackubtchik
; ---------------------------------------------------------------
.386
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
; -------------------------------------------------------------
; convert DWORD to ascii string
; dwValue is value to be converted
; lpBuffer is the address of the receiving buffer
; EXAMPLE:
; invoke dwtoa,edx,ADDR buffer
;
; Uses: eax, ecx, edx.
; -------------------------------------------------------------
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 24 sept. 2004 à 12:34
Salut,
div est une calamite en terme de performances, quand le diviseur est connu (constante) on multiplie par son inverse.
Exemple divise 10 sur registres 32 bits:
mov eax, dividend
mov ecx, 3435973837
mul ecx
shr edx, 3
EDX = RESULT
28 sept. 2004 à 19:09
Je te send mon utilitaire qui te calculera tout cela.
28 sept. 2004 à 18:58
28 sept. 2004 à 18:50
28 sept. 2004 à 18:22
mov ecx, 3435973837
mul ecx
shr edx, 3
J'ai pas du tout compris ca!
26 sept. 2004 à 00:45
C'est ma première routine en assembleur, excepté le Hello World de prise en main.
J'essaie en fait de programmer un convertisseur multi-base pour me familiariser avec l'assembleur.
Visiblement ça prendra du temps, je le prendrai.
@++.
25 sept. 2004 à 17:03
A quoi sert l'empilage et depilage des 2 params ???
Ils ne sont lus qu'1 seule fois donc devaient etre passes en registres, 6 cycles de gagnes rien que la.
25 sept. 2004 à 16:43
La méthode de masm32 pour passer d'un DW a une chaine de caractere ascii, dwtoa
ToutEnMasm
; #########################################################################
; ---------------------------------------------------------------
; This procedure was originally written by Tim Roberts
;
; Part of this code has been optimised by Alexander Yackubtchik
; ---------------------------------------------------------------
.386
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
.code
; #########################################################################
dwtoa proc dwValue:DWORD, lpBuffer:DWORD
; -------------------------------------------------------------
; convert DWORD to ascii string
; dwValue is value to be converted
; lpBuffer is the address of the receiving buffer
; EXAMPLE:
; invoke dwtoa,edx,ADDR buffer
;
; Uses: eax, ecx, edx.
; -------------------------------------------------------------
push ebx
push esi
push edi
mov eax, dwValue
mov edi, [lpBuffer]
or eax,eax
jnz sign
zero:
mov word ptr [edi],30h
jmp dw2asc
sign:
jns pos
mov byte ptr [edi],'-'
neg eax
inc edi
pos:
mov ecx,429496730
mov esi, edi
.while (eax > 0)
mov ebx,eax
mul ecx
mov eax,edx
lea edx,[edx*4+edx]
add edx,edx
sub ebx,edx
add bl,'0'
mov [edi],bl
inc edi
.endw
mov byte ptr [edi], 0 ; terminate the string
; We now have all the digits, but in reverse order.
.while (esi < edi)
dec edi
mov al, [esi]
mov ah, [edi]
mov [edi], al
mov [esi], ah
inc esi
.endw
dw2asc:
pop edi
pop esi
pop ebx
ret
dwtoa endp
; #########################################################################
end
24 sept. 2004 à 12:34
div est une calamite en terme de performances, quand le diviseur est connu (constante) on multiplie par son inverse.
Exemple divise 10 sur registres 32 bits:
mov eax, dividend
mov ecx, 3435973837
mul ecx
shr edx, 3
EDX = RESULT
Bonne continuation.