;was not tested for speed(n'a pas ete' teste' pour la vitesse)
;only an exercise, seulement un exercice
Procedure StrL(l.l,*p)
!MOV eax,dword[p.v_l]
! PUSH edi;+4 for the push
! MOV edi,dword[p.p_p+4];the pointer value adapte' pour le push
! MOV dl ,255 ;make end marker,marque de fin
! PUSH edx ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
!MOV ecx ,10 ;
! x0:
!MOV edx ,0
!DIV ecx ; divide eax by 10
!PUSH edx ; save the rest <<<<<<<<<<<<<<<<<<<<<<<
!CMP eax ,0; result of division
!JA x0 ; is eax 0 ? finished ?
!x2:
!POP eax ; start getting back the results of divisions>>>>>>>>>>>>recuperer les resultats
!CMP al ,255 ; untill start/end marker found
!JE x9
!ADD al ,'0'
!STOSB
!JMP x2
! x9:
!MOV al,0
!STOSB ; finished ZERO TERMINATING,mettre un zero
! POP edi ; restore edi>>>>>>>>>>>>>>>>>>>>>>>>>
EndProcedure
;ALLOCATION OF SPACE
st.s="00000000000000"
Debug st
b.l=19191919;number to convert
Strl(b,@st);or stp
Debug st
End
;cette fois çi,j'emplois le "IN LINE ASM"
;n'oubliez pas de le selecter (config)
;De cette façon on peux suivre
;parfaitement avec le "debugger"(ce qui n'est pas possible
;quand on est avec l'autre façon(! avec les points
;d'exclamation)
Procedure StrL(l.l,p.l)
;p.l est un "dummy" pour que l'assembleur
;passe le pointeur a la procédure
;p per sè n'est pas employé ici.
Debug "@st "+Hex(p)
Debug "l.l "+Hex(l)
;il y a peut être un autre moyen ?
;la seule difference est a l'entrée
MOV eax,l
;in LIST.ASM p.v_p is declared as an EQUATE
; esp+pso+4 (return pushed +4 ? what is pso ?)Je ne sais pas
;PUSH edi;décommentez pour sauver edi,commentez au suivant
MOV edi,[esp+8];dword[p.v_p+4];the pointer value
;mov edi,[esp+12];décommentez si edi est sauvé.
MOV dl ,255 ;faisons une marque de fin
PUSH edx ;sauvons la.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
MOV ecx ,10 ;le diviseur
! x0:
MOV edx ,0
DIV ecx ; divisons eax par 10
PUSH edx ; savons le reste <<<<<<<<<<<<<<<<<<<<<<<
CMP eax ,0; resultat de la division
JA x0 ; eax = 0 ? fini ?
!x2:
POP eax ;commençons a reprendre les resultats des divisions>>>>>>>>>>>>
CMP al ,255 ; j'usqu'à ce que la marque de fin est trouvée
JE x9
ADD al ,'0'
STOSB
JMP x2
! x9:;! sont necessaires pour les relais
MOV al,0;
STOSB ; c'est fini mettons un zéro pour terminer la chaine
;décommentez si edi est sauvé
; POP edi ; restore edi>>>>>>>>>>>>>>>>>>>>>>>>>
EndProcedure
;ALLOCATION de Place
st.s="00000000000000"
Debug "Avant la convertion : " +st
b.l=19191919;ici le nombre à convertir******************
Debug @st
Strl(b,@st);
Debug "La convertion finie : "+ st
End
gebe :)
;j'emplois le "IN LINE ASM"
;n'oubliez pas de le selecter (config)
;De cette façon on peux suivre
;parfaitement avec le "debugger"(ce qui n'est pas possible
;quand on est avec l'autre façon(! avec les points
;d'exclamation)
; une drole de division !!
;je l'ai juste fini
;completement differente......
;3 a 4 foix plus rapide ...Je crois
;laissez moi savoir
Procedure StrL_by_mul_no_rev(l.l,p.l)
;p.l est encore un "dummy" pour que l'assembleur
;passe le pointeur a la procédure
;p per sè n'est pas employé ici.
Debug "@st "+Hex(p)
Debug "l.l "+Hex(l)
MOV esi ,10
MOV ebx ,0x1999999a
MOV edi ,[esp +8];8 +15;p.v_p + 15
ADD edi ,15
STD
MOV eax,l
!boucle:
MUL ebx
PUSH edx
MUL esi
XCHG al, dl
ADD al,'0'
STOSB
POP eax
CMP eax ,0
JNE boucle
CLD
ADD edi,1
MOV eax,edi
EndProcedure
;ALLOCATION de Place
st.s="................"+Chr(0)
Debug "Avant la convertion : " +st
b.l=123456789;ici le nombre à convertir******************
Debug @st
Strl_by_mul_no_rev(b,@st);
Debug "La convertion finie : "+ st
End
;gebe :)