conversion d'un nombre pour montrer sur l'ecran(to string)

Pour discuter de l'assembleur
gebe
Messages : 6
Inscription : ven. 01/juin/2007 19:06

conversion d'un nombre pour montrer sur l'ecran(to string)

Message par gebe »

Bonjour a tous,

Une autre conversion

nombre a chaine (Number to string)

Excusez mon francais je n'ai pas d'experience en francais dans les ordinateurs.(30 ans d'anglais)

Code : Tout sélectionner


;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
gebe :)
gebe
Messages : 6
Inscription : ven. 01/juin/2007 19:06

Message par gebe »

Le contrepoint .(En Français)

En n'employant pas les accents circonflexes.


Code : Tout sélectionner

;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 :) 
gebe
Messages : 6
Inscription : ven. 01/juin/2007 19:06

Message par gebe »

une autre façon:

Code : Tout sélectionner


;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 :) 
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Sympa tes petits bouts de programmes
N'hésite pas à en remettre :D
Répondre