Conversion hexa=>déci et déci=>hexa sur 64 bits

Description

Ce programme converti toutes les valeurs Hexadécimales (jusqu'à 64 bits)
en neombre décimal équivalent et vice-versa.
Il traite les valeurs positives et négatives comprises entre
- 18 446 744 073 709 551 615 et + 18 446 744 073 709 551 615,
ce qui est déjà pas mal !!... et suffisant pour les besoins courants.

Source / Exemple :


.386
.model flat,stdcall
option casemap:none

;**********************************

include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\comdlg32.inc
include \masm32\include\gdi32.inc

includelib \masm32\lib\masm32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\comdlg32.lib
includelib \masm32\lib\gdi32.lib

;********************************
;      MACROS     
;********************************

      szText MACRO Name, Text:VARARG
        LOCAL lbl
          jmp lbl
            Name db Text,0
          lbl:
        ENDM

    
;***********************************
;          PROTO
;***********************************
 
   BmpProc     proto :DWORD, :DWORD, :DWORD, :DWORD
   BmpProc1    proto :DWORD, :DWORD, :DWORD, :DWORD
   BmpProc2    proto :DWORD, :DWORD, :DWORD, :DWORD
   BmpProc3    proto :DWORD, :DWORD, :DWORD, :DWORD
   BmpButton   proto :DWORD, :DWORD, :DWORD, :DWORD,:DWORD,:DWORD
   DlgProc     proto :DWORD, :DWORD, :DWORD, :DWORD
   DlgProc1    proto :DWORD, :DWORD, :DWORD, :DWORD
   DlgProc2    proto :DWORD, :DWORD, :DWORD, :DWORD
   Ed1Proc1    PROTO :DWORD,:DWORD,: DWORD,:DWORD
   Ed1Proc2    PROTO :DWORD,:DWORD,: DWORD,:DWORD
   Convert     PROTO :LPSTR,:DWORD
   Convert1    PROTO :LPSTR,:DWORD
   Savapa      PROTO : DWORD
   Multiplie   PROTO 
   Divise      PROTO
   Arrondi     PROTO
   
   DqToHex1    PROTO :QWORD, :DWORD, :DWORD
   atodq1      PROTO :DWORD, :DWORD
   HexToDq1    PROTO :DWORD, :DWORD
   dqtoa1      PROTO :QWORD, :DWORD, :DWORD
   
.Const

    IDC_EDIT1       equ 3000
    IDC_EDIT2       equ 3001
    IDC_OK          equ 3002
    IDC_EXIT        equ 3004 
    IDC_SIGNE       equ 3005
    IDC_NSIGNE      equ 3006 

; #######################################################

.data?
      
      hInstance   dd ?
      hWND        dd ?
      hIcon       dd ?
      hBmp1       dd ?
      hBmp2       dd ?
      hBmp3       dd ?
      hBmp4       dd ?
      hBmp5       dd ?
      hBmp6       dd ?
      hBmp7       dd ?
      hBmp8       dd ?
      hBtn1       dd ? 
      hBtn2       dd ?
      hBtn3       dd ?
      hBtn4       dd ?
      lpfnProc    dd ?
      lpfnEd1Proc dd ?
      Drapo       dd ? 
      hEdit1      dd ?
      hEdit2      dd ?
      hTxt1       dd ? 
      Signe       dd ?
      monText1    db 50 dup (?)
      monText2    db 50 dup (?)
      resultat    db 18 dup (?)  
      Pospoint    dd ?
      long        dd ?
      result      dq ?
      Reste       dq ?
      nbch        dd ?
      Cpt         dd ?
      Cpt1        dd ? 
      signe       dd ? 
; **********************************************      
    .data
        Msg1  db 'Y a Rien!!!!!!',0
        Msg2  db "Trop d'octets !!!! : 16 maximum.",0        
        Msg3  db 'Fodrait kèke chose!!!',0
        Taux       REAL8  6.55957
        Complement REAL8  0.005
        chaine db ".",0
        deuzero db ".00",0
        zero db "0",0
   
;*************************************

.code
start:
	invoke GetModuleHandle, NULL
	mov    hInstance,eax
encore:
      invoke DialogBoxParam,hInstance,101,NULL,addr DlgProc,NULL    
	invoke ExitProcess,NULL

;**************************************************************

DlgProc proc hWin :HWND,uMsg :UINT,wParam :DWORD,lParam :DWORD
     
    mov eax,hWin
    mov hWND,eax 

    .IF uMsg == WM_INITDIALOG
        call ChargeBmp

    .ELSEIF uMsg == WM_COMMAND

        .if wParam == 400  ; bouton Deci=>hexa
            mov Drapo,0    ; bascule pour la Procédure approprriée
;**************************************************************
;Fermeture de la boite de Dialogue principale et création de la
; 2ème boite de dialogue.
;**************************************************************            
            invoke EndDialog,hWin,NULL 
            invoke DialogBoxParam,hInstance,102,NULL,addr DlgProc1,0 
             
        .elseif wParam == 401  ; bouton Hexa=>Deci
            mov Drapo,1
            invoke EndDialog,hWin,NULL 
            invoke DialogBoxParam,hInstance,103,NULL,addr DlgProc1,0 
              
        .elseif wParam == 402  ;bouton Francs=>Euros
            mov Drapo,2
            invoke EndDialog,hWin,NULL 
            invoke DialogBoxParam,hInstance,104,NULL,addr DlgProc2,0 
                  
        .elseif wParam == 403  ; bouton Euros=>Francs
            mov Drapo,3
            invoke EndDialog,hWin,NULL 
            invoke DialogBoxParam,hInstance,105,NULL,addr DlgProc2,0  
        .endif
 
    .ELSEIF uMsg == WM_CLOSE
        jmp ExitProcess
    .ENDIF
@@:
    xor eax,eax
    ret   
DlgProc endp

;  **********************************************

DlgProc1 proc hWin :HWND,uMsg :UINT,wParam :DWORD,lParam :DWORD 
LOCAL Ps : PAINTSTRUCT

.IF uMsg == WM_INITDIALOG
;**************************************************************
; Récupération des handles des 2 éditeurs et du texte associé.
; Placer le focus dans l'éditeur du haut
; Sélectionner la procédure associée à hEdit1.
;**************************************************************
        invoke GetDlgItem,hWin,IDC_EDIT1
        mov hEdit1,eax 
        invoke SetFocus,hEdit1
        invoke GetDlgItem,hWin,IDC_EDIT2
        mov hEdit2,eax
        invoke GetDlgItem,hWin,301
        mov hTxt1,eax
        invoke SetWindowLong,hEdit1,GWL_WNDPROC,Ed1Proc1
        mov lpfnEd1Proc,eax
    
.ELSEIF uMsg==WM_CLOSE
     invoke ExitProcess,NULL

.ELSEIF uMsg==WM_PAINT
;**************************************************************
;Trace un cadre autour des éditeurs.
; Le cadre autour du texte est spécifié dans le  fichier.rc
;**************************************************************
    invoke BeginPaint,hWin,addr Ps
    invoke FrameGrp,hTxt1,hEdit2,6,2,0
    invoke EndPaint,hWin,addr Ps

.ELSEIF uMsg == WM_COMMAND
    .if wParam == IDC_OK
;**************************************************************
; Remettre le focus en place, vider le buffer qui recevra la 
; valeur à convertir,appeler la procédure chargée du traitement
; en fonction de la valeur de la bascule et enfin placer le
; résultat dans hEdit2.
;**************************************************************    
        invoke SetFocus,hEdit1
        call VideBuff
        invoke GetDlgItemText,hWin,IDC_EDIT1,addr monText1,50
        .if Drapo == 0
            invoke Convert,addr monText1,addr monText2
        .elseif Drapo == 1
            invoke Convert1,addr monText1,addr monText2
        .endif            
        invoke SetDlgItemText,hWin,IDC_EDIT2,addr monText2

    .elseif wParam == IDC_EXIT
;**************************************************************
; terminer proprement en nettoyant la pile et relancer
; la boite de dialogue principale.
;**************************************************************    
            invoke EndDialog,hWin,NULL
            leave
            sub esp,10h 
            jmp encore
;**************************************************************
; placer une bascule à 1 pour une valeur négative ou à 0 pour
; une valeur positive
;**************************************************************
    .elseif wParam==IDC_SIGNE
        mov Signe,1
        invoke SetFocus,hEdit1
    .elseif wParam==IDC_NSIGNE
        mov Signe,0
        invoke SetFocus,hEdit1
     .endif

.ELSE
    mov eax,FALSE
    ret
.ENDIF

mov eax,TRUE
ret   
DlgProc1 endp

;*****************************************   

DlgProc2 proc hwnd:HWND, UMsg:UINT, WParam:WPARAM, LParam:LPARAM
LOCAL Ps : PAINTSTRUCT
;**************************************************************
; Procédure utilisée pour les conversions Franc => Euros
; et Euros => Francs.
; Fonctionnement identique à DialogProc1, sauf, bien entendu, 
; que les procédures de traitement appelées sont différentes.
;**************************************************************

 .if UMsg==WM_INITDIALOG
     invoke GetDlgItem, hwnd,IDC_EDIT1
     mov hEdit1,eax
     invoke SetFocus,hEdit1
     invoke SetWindowLong,hEdit1,GWL_WNDPROC,Ed1Proc2
     mov lpfnEd1Proc, eax
    
 .elseif UMsg==WM_CLOSE
     invoke ExitProcess,NULL

 .ELSEIF UMsg==WM_PAINT
     invoke BeginPaint,hwnd,addr Ps
     invoke FrameGrp,hTxt1,hEdit2,6,2,0
     invoke EndPaint,hwnd,addr Ps

 .elseif UMsg==WM_COMMAND

     .if WParam==IDC_OK
         invoke SetFocus,hEdit1
         call VideBuff
         invoke GetDlgItemText,hwnd,IDC_EDIT1,ADDR monText1,50
         .if Drapo == 2
             invoke Divise
         .elseif Drapo == 3
             invoke Multiplie
         .endif
         invoke SetDlgItemText,hwnd,IDC_EDIT2,ADDR monText2

     .elseif WParam==IDC_EXIT
         invoke EndDialog, hwnd,NULL
         leave
         sub esp,10h 
         jmp encore
     .endif
 
 .else
     mov eax,FALSE
     ret
 .endif
     mov eax,TRUE
     ret

DlgProc2 endp

;*****************************************  
 
Ed1Proc2 proc hCtl: DWORD,
             uMsg1: DWORD,
             wParam1: DWORD,
             lParam1: DWORD
;**************************************************************
;Cette procédure traite les entrées clavier dans l'éditeur N°1
; n'accepte que les chiffres 0 à 9 inclus et la virgule ou le
; point.Remplace la virgule éventuelle par le point.
; en fin de traitement, renvoie à la procédure normale.
;**************************************************************             

    .if uMsg1 == WM_CHAR
        .if wParam1 < "0"
           .if wParam1 == ","
               mov wParam1,"."
           .endif
           .if wParam1 == "."
               jmp accept
           .endif
           xor eax,eax
           ret
        .endif    
        .if wParam1 > "9"
           xor eax,eax
           ret
        .endif
    .endif

 accept:
      invoke CallWindowProc, lpfnEd1Proc, hCtl, uMsg1,wParam1,lParam1
    ret

Ed1Proc2 endp

;*****************************************

Ed1Proc1 proc hCtl: DWORD,
             uMsg1: DWORD,
             wParam1: DWORD,
             lParam1: DWORD
;**************************************************************
; traite les entrées clavier pour les conversions Hexa => Deci 
; et Deci => Hexa. N'accepte que : retour arrière,espace,chiffres
; 0,1,2,3,4,5,6,7,8,9 si bascule Drapo = 0. Si bascule =1
; accepte en plus A,B,C,D;E,F ou a,b,c,d,e,f
;**************************************************************             

    .if uMsg1 == WM_CHAR
        .if wParam1 < "0"
            .if wParam1 == 8
                jmp accept
            .elseif wParam1 == 20h
                jmp accept             
            .elseif wParam1 == 2Dh
                jmp accept
           .else 
                xor eax,eax
                ret
           .endif
        
        .elseif wParam1 > "9"
           .if Drapo == 1
              .if wParam1 >= 'A' && wParam1 <= 'F'
                  jmp accept
              .elseif  wParam1 >= 'a' && wParam1 <= 'f'
                  jmp accept
              .endif   
           .endif
           xor eax,eax
           ret
        .endif
    .endif

 accept:
      invoke CallWindowProc, lpfnEd1Proc, hCtl, uMsg1,wParam1,
                             lParam1
    ret

Ed1Proc1 endp

;***************************

 BmpButton proc hParent:DWORD,a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,ID:DWORD
;**************************************************************
; réation des boutons
;************************************************************** 

    szText BmpBtnCl,"BUTTON"
    szText blnk2,0

    invoke CreateWindowEx,0,addr BmpBtnCl,addr blnk2,WS_CHILD or WS_VISIBLE or \
                          BS_BITMAP,a,b,wd,ht,hParent,ID,hInstance,NULL
    ret 
BmpButton  endp
 

;**************************************************************
; les 4 procédures suivantes seront associées aux 4 boutons
; de la boite de dialogeue pour gérer  leur apparence suivant
; que le bouton de la souris est enfoncé ou relaché.
;**************************************************************

BmpProc proc hCtl:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD

    .if uMsg == WM_LBUTTONDOWN
        invoke SendMessage,hBtn1,BM_SETIMAGE,0,hBmp2
    .elseif uMsg == WM_LBUTTONUP
        invoke SendMessage,hBtn1,BM_SETIMAGE,0,hBmp1
    .endif
    invoke CallWindowProc,lpfnProc,hCtl,uMsg,wParam,lParam
    ret
BmpProc  endp 
 
;*****************************************

BmpProc1 proc hCtl:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD

    .if uMsg == WM_LBUTTONDOWN
        invoke SendMessage,hBtn2,BM_SETIMAGE,0,hBmp4
    .elseif uMsg == WM_LBUTTONUP
        invoke SendMessage,hBtn2,BM_SETIMAGE,0,hBmp3
    .endif
    invoke CallWindowProc,lpfnProc,hCtl,uMsg,wParam,lParam
    ret
BmpProc1  endp 
 
;*****************************************

BmpProc2 proc hCtl:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD

    .if uMsg == WM_LBUTTONDOWN
        invoke SendMessage,hBtn3,BM_SETIMAGE,0,hBmp6
    .elseif uMsg == WM_LBUTTONUP
        invoke SendMessage,hBtn3,BM_SETIMAGE,0,hBmp5
    .endif
    invoke CallWindowProc,lpfnProc,hCtl,uMsg,wParam,lParam
    ret
BmpProc2  endp 
 
;*****************************************

BmpProc3 proc hCtl:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD

    .if uMsg == WM_LBUTTONDOWN
        invoke SendMessage,hBtn4,BM_SETIMAGE,0,hBmp8
    .elseif uMsg == WM_LBUTTONUP
        invoke SendMessage,hBtn4,BM_SETIMAGE,0,hBmp7
    .endif
    invoke CallWindowProc,lpfnProc,hCtl,uMsg,wParam,lParam
    ret
BmpProc3  endp 

;**************************************************************
; Cette procédure charge les bitmaps, créé les boutons et y 
; place les images. Elle sélectionne également les procédures
; propres à chaque bouton.
;**************************************************************

ChargeBmp proc
            invoke LoadBitmap,hInstance,18
            mov hBmp1,eax

            invoke LoadBitmap,hInstance,19
            mov hBmp2,eax

            invoke LoadBitmap,hInstance,20
            mov hBmp3,eax

            invoke LoadBitmap,hInstance,21
            mov hBmp4,eax

            invoke LoadBitmap,hInstance,22
            mov hBmp5,eax

            invoke LoadBitmap,hInstance,23
            mov hBmp6,eax

            invoke LoadBitmap,hInstance,24
            mov hBmp7,eax

            invoke LoadBitmap,hInstance,25
            mov hBmp8,eax

            invoke BmpButton,hWND,20,110,100,40,400
            mov hBtn1,eax
            invoke SendMessage,hBtn1,BM_SETIMAGE,0,hBmp1
            invoke SetWindowLong,hBtn1,GWL_WNDPROC,BmpProc
            mov lpfnProc,eax

            invoke BmpButton,hWND,180,110,100,40,401
            mov hBtn2,eax
            invoke SendMessage,hBtn2,BM_SETIMAGE,0,hBmp3
            invoke SetWindowLong,hBtn2,GWL_WNDPROC,BmpProc1 
            mov lpfnProc,eax  

            invoke BmpButton,hWND,20,165,100,40,402
            mov hBtn3,eax
            invoke SendMessage,hBtn3,BM_SETIMAGE,0,hBmp5
            invoke SetWindowLong,hBtn3,GWL_WNDPROC,BmpProc2
            mov lpfnProc,eax

            invoke BmpButton,hWND,180,165,100,40,403
            mov hBtn4,eax
            invoke SendMessage,hBtn4,BM_SETIMAGE,0,hBmp7
            invoke SetWindowLong,hBtn4,GWL_WNDPROC,BmpProc3 
            mov lpfnProc,eax
            ret
ChargeBmp endp

;*****************************************

Convert proc decString:LPSTR, hexString:LPSTR
LOCAL NB1 :QWORD
;**************************************************************
; Procédure qui transforme un nombre décimal en un nombre Hexa
; signé ou non signé.
;************************************************************** 
        mov esi,decString
        cmp byte ptr[esi],0 ; vérifie qu'on a entré un nombre.
        jne SaVa
        invoke Savapa,addr Msg3
        ret
SaVa:       
        call Otespace ; suppression de tous les espaces éventuels
;**************************************************************
; transformation de la chaîne entrée en un nombre 64 bits
;**************************************************************        
        invoke atodq1,decString,addr NB1
;**************************************************************
;Appel de la proc qui va trasformer le nombre 64 bit en une
; chaine Hexa. Valeur négative ou positive suivant la valeur
; du dernier parametre de l'appel.
;**************************************************************        
        .if Signe == 1
            invoke DqToHex1,NB1,hexString,1
        .else
            invoke DqToHex1,NB1,hexString,0
        .endif
        ret

Convert endp

;******************************************

 Convert1 proc hexString1 :DWORD,decString1 :DWORD
    LOCAL NB1  :QWORD
;**************************************************************
; Cette proc convertit une chaine Hexa jusqu'à 64 bits en sa
; valeur (positive ou négative) équivalente en Décimale.
;**************************************************************    

    mov esi,[hexString1]
    cmp byte ptr[esi],0  ; controle
    jne Sava
    invoke Savapa,addr Msg1
    ret
Sava:
    call Otespace       ; oter les espaces
    mov esi, hexString1
    invoke lnstr,hexString1 ;longueur chaine entrée
    .if eax > 16 ; + de 64 bits : pas possible
        jmp Sacolpa
    .elseif eax < 16
        mov edx,16  ; recherche du Nb d'octets manquants
        sub edx,eax ; pour faire 16
        mov ecx,eax
        add esi,eax ; placer esi en fin de Chaine
        dec esi
        mov edi,esi ; et edi = fin de chaine
        add edi,edx ; + Nb octets manquants
        std   ; marche arrière
@@:           ; transfert de la chaine en commençant par la fin
        lodsb
        stosb
        dec ecx
        cmp ecx,0
        je @F
        jmp @B
@@:
        .Repeat  ; compléter a 16 octetes avec des 0
            mov byte ptr[edi],30h
            dec edi
            dec edx
        .Until edx == 0
        cld        ; retour en marche avant
    .endif
    lea edi,NB1
    mov dword ptr[edi],0
    mov dword ptr[edi+4],0
;**************************************************************
; appel de la procedure qui transforme la chaine hexa en Nb
; 64 bits dans un QWORD.
;**************************************************************    
    invoke HexToDq1,hexString1,addr NB1
;**************************************************************
; dqtoa transforme la valeur QWORD en une chaine décimale 
; positive ou négative suivant la valeur du dernier parametre
;**************************************************************    
    .if Signe == 1
        invoke dqtoa1,NB1,decString1,1
    .else
        invoke dqtoa1,NB1,decString1,0
    .endif
    ret     
Sacolpa:
    invoke Savapa,addr Msg2 
    ret

Convert1 endp

;******************************************

VideBuff proc
    
    mov edi,offset monText2
    mov ecx,50
    xor eax,eax
    rep stosb
    ret

VideBuff endp

;******************************************

Multiplie  proc   ; Francs ==> Euros
   
   cmp byte ptr monText1[0],0
   jne SaVat
   invoke Savapa,addr Msg3
   ret
SaVat:
   invoke StrToFloat, addr monText1,addr  result
   fld result
   fmul Taux  
   fadd Complement        
   fstp result
   invoke Arrondi
   ret

Multiplie endp

;******************************************
 
Divise  proc    ; Euros ==> Francs

   cmp byte ptr monText1[0],0
   jne Savat
   invoke Savapa,addr Msg1
   ret
Savat: 
   invoke StrToFloat, addr monText1,addr  result
   fld result
   fdiv Taux 
   fadd Complement        
   fstp result
   invoke Arrondi
   ret

Divise endp 

;**************************************************************
; procédure qui arrodi le résulat a 2 décimales, a la valeur 
; supérieure ou inférieure suivant la valeur dela 3ème décimale
;**************************************************************

Arrondi  proc
   invoke FloatToStr2,result,offset resultat
   invoke InString,1,addr resultat,addr chaine
   mov Pospoint,eax
   .if Pospoint == 0
       invoke szCatStr,addr resultat,addr deuzero
       invoke lnstr,addr resultat
       invoke szLeft,addr resultat,addr monText2,eax
       jmp ctout
   .endif
   invoke lnstr,addr resultat
   sub eax, Pospoint
   mov long,eax
   add Pospoint,1
   .if long == 1
       invoke szCatStr,addr resultat,addr zero
       invoke szLeft,addr resultat,addr monText2,Pospoint
   .elseif long > 1
       invoke szLeft,addr resultat,addr monText2,Pospoint
   .endif
ctout:
   ret
Arrondi endp

;********************************

Otespace proc

@0:
    .if byte ptr[esi] != 0
        cmp byte ptr[esi],20h
        je @F
        inc esi
        jmp @0
@@:
        push esi
        mov edi,esi
        inc esi
@@:
        cmp byte ptr[edi],0
        je @1
        lodsb
        stosb
        jmp @B
@1:
        pop esi
        jmp @0
    .endif
    ret

Otespace endp

;******************************************

Savapa proc Message
     mov esi,[Message]
     mov edi,offset monText2
     cld
lp1: 
     lodsb
     stosb
     test al,al
     jne lp1
     ret
Savapa endp

;***************************************************
; Procédure qui transforme une chaine hexa en
; 1 QWORD de même valeur.
;***************************************************

HexToDq1 proc str2 :DWORD,N1 :DWORD

LOCAL cpt :DWORD

    mov edi,N1
    mov esi,str2
@7:
    cmp byte ptr[esi],20h
    je @F
    cmp byte ptr[esi],0
    jne @8
    jmp @6
@@:
    inc esi
    jmp @7
@8:
    xor eax,eax
    xor ebx,ebx
    mov cpt,1
    add edi,7
@0:
    mov ecx,4
@1:
    lodsb
    cmp al,57
    jbe @2
    and al,0DFh
    sub al,37h
    jmp @3
@2:
    cmp al,0
    je @6
    sub al,30h
@3:
    shl al,4
    add ebx,eax
    lodsb
    cmp al,57
    jbe @4
    and al,0DFh
    sub al,37h
    jmp @5
@4:
    sub al,30h
@5:
    add ebx,eax
    mov byte ptr[edi],bl
    dec edi
    xor ebx,ebx
    loop @1
    dec cpt
    js @6
    .while byte ptr[esi]==20h
       inc esi
    .endw
    jmp @0
@6:
    ret

HexToDq1 endp

;****************************************** 
dqtoa1 proc Nombrere:QWORD,buffer:DWORD,sens:DWORD

;***************************************************
; procedure qui transforme un QWORD en une chaine
; décimale lisible, représentant sa valeur.
;***************************************************

         pushad
         mov eax,sens
         mov signe,eax
         lea esi,Nombrere
         lea edi,Reste
         xor eax,eax
         mov [edi],eax
         mov [edi+4],eax
         mov ecx,64
         mov Cpt1,63
         mov eax,[esi]
         mov ebx,[esi+4]
         cmp signe,1
         jne @F
         not eax
         not ebx
         add eax,1
         adc ebx,0
@@:
         push ecx
         mov ecx,[edi]
         mov edx,[edi+4] 
         shl ebx,1
         adc ecx,0
         shl eax,1
         adc ebx,0
         mov [esi],eax
         mov [esi+4],ebx
         mov [edi],ecx
         push eax
         push ebx
         mov eax,540BE400h
         mov ebx,00000002h
         cmp edx,ebx
         ja @0
         jb @1
         cmp ecx,eax
         jb @1
@0:
         sub ecx,eax
         sbb edx,ebx
         mov [edi],ecx
         mov [edi+4],edx
         mov Cpt,1
         jmp stop
@1:
         mov Cpt,0
stop:
         pop ebx
         pop eax
         dec Cpt1
         js yapu
         shl edx,1
         clc
         shl ecx,1
         adc edx,0
         mov [edi],ecx
         mov [edi+4],edx
yapu:
         add eax,Cpt
         mov [esi],eax
         pop ecx
         loop @B
         mov eax,[edi]
         mov edx,[edi+4]
         mov ecx,10
         mov edi,buffer
         add edi,29
@@:
         div ecx
         add dl,30h
         mov byte ptr[edi],dl
         dec edi
         xor dl,dl
         inc nbch
         cmp eax,0
         je @F
         jmp @B
@@:
         mov eax,[esi]
         mov edx,[esi+4]
         cmp eax,0 ; eax nul : voir edx
         jne @2    ; non nul : traiter
         cmp edx,0 ; edx également nul
         je @F     ; passer au formatage.
@2:
 ; si la division par 10 000 000 000 tombe sur
 ; un ou des zéro, ils n'apparaissent pas,
 ; il faut donc les restituer mais
 ; uniquement si il ya qq. chose à placer devant
         cmp nbch,10
         je @3      
         mov byte ptr[edi],30h
         dec edi     
         inc nbch
         jmp @2
@3:
         div ecx
         add dl,30h
         mov byte ptr[edi],dl
         dec edi
         xor dl,dl
         inc nbch
         cmp eax,0
         je @F
         jmp @3
@@:
         inc edi
         mov esi,edi
@@:
         cmp byte ptr[esi],30h
         jne @F
         inc esi
         jmp @B
@@:
         mov edi,buffer
         cmp signe,1
         jne @F
         mov byte ptr[edi],2Dh
         inc edi
         mov byte ptr[edi],20h
         inc edi
@@:
         mov eax,nbch
         mov ecx,3
         div ecx
         cmp edx,0
         je ici
         mov ecx,edx

@@:      
         cmp byte ptr [esi],0
         je stp
         movsb
         loop @B 
         mov byte ptr [edi],20h
         inc edi
ici:     
         mov ecx,3
@@:      
         cmp byte ptr [esi],0
         je stp
         movsb
         loop @B          
         mov byte ptr [edi],20h
         inc edi
         jmp ici
stp:     
         mov byte ptr [edi],0  
         mov nbch,0
         popad
         ret

dqtoa1 endp 

;*****************************************************
; procedure qui change un Nb QWORD en une chaine hexa
; de même valeur, affichable et lisible.
;***************************************************** 
DqToHex1 proc uses eax ebx ecx N1 :QWORD,Buff :DWORD,
                              Sens:DWORD

LOCAL cpt : Byte
LOCAL Signes :DWORD
LOCAL retenue:DWORD

    mov eax,Sens
    mov Signes,eax
    mov cpt,1
    xor eax,eax
    mov retenue,eax 
    lea esi,N1
    mov edi,Buff
    add edi,16
    cmp Signes,1
    jne @F
    mov ebx,[esi]
    not ebx
    add ebx,1
    adc retenue,0
    jmp @0
@@:
    mov ebx,[esi]
@0:
    mov ecx,7
@1:
    mov al,bl
    and al,0Fh
    add al,48
    cmp al,58
    jb @2
    add al,7
@2:
    mov [edi],al
    shr ebx,4
    dec edi
    dec ecx
    jns @1
    dec cpt
    js @3
    mov byte ptr[edi],20h
    dec edi
    cmp signe,1
    jne @F
    mov ebx,[esi+4]
    not ebx
    add ebx,retenue
    jmp @0
@@:
    mov ebx,[esi+4]
    jmp @0
@3: 
    ret

DqToHex1 endp

;*********************************************

atodq1 proc uses eax ebx ecx edx Str1:DWORD,Nb1:DWORD
LOCAL Negat :DWORD

;*****************************************************
; but : transformer une chaine décimale en 1 QWORD
; de valeur équivalente.
;*****************************************************
    mov esi,Str1
    xor edi,edi
    xor eax,eax
    mov Negat,eax
    xor edx,edx
    xor ebx,ebx
    mov ecx,10
    cmp byte ptr[esi],2Dh
    jne @0
    inc esi
    mov Negat,1    
@0:
    cmp byte ptr[esi+1],0
    je @3
    mov bl,[esi]
    sub bl,30h
    add eax,ebx
    inc esi
    mul ecx
    cmp edi,0
    jne @2
    cmp edx,0
    jne @1
    jmp @0
@1:
    cmp edi,0
    jne @2
    mov edi,edx
    jmp @0
@2:
    xchg eax,ebx
    mov eax,edi
    push edx
    xor edx,edx
    mul ecx
    pop edx
    add edx,eax
    mov edi,edx
    xor eax,eax
    xchg eax,ebx
    jmp @0
@3:
    mov bl,[esi]
    sub bl,30h
    add eax,ebx
    jnc @F
    adc edx,0
@@:    
    cmp Negat,1
    jne @4
    not eax
    not edx
    add eax,1
    adc edx,0
@4:
    mov esi,Nb1
    mov [esi],eax
    mov [esi+4],edx
    ret

atodq1 endp

;******************************************

end start
;******************************************

;Fichier ressource de Conversions.asm

 #include "\masm32\include\resource.h"
500 ICON DISCARDABLE "icon4.ico"

 18 BITMAP MOVEABLE PURE LOADONCALL DISCARDABLE "Bitmaps\file0008.BMP" 
 19 BITMAP MOVEABLE PURE LOADONCALL DISCARDABLE "Bitmaps\file0009.BMP"
 20 BITMAP MOVEABLE PURE LOADONCALL DISCARDABLE "Bitmaps\file0010.BMP"
 21 BITMAP MOVEABLE PURE LOADONCALL DISCARDABLE "Bitmaps\file0011.BMP"
 22 BITMAP MOVEABLE PURE LOADONCALL DISCARDABLE "Bitmaps\file0012.BMP" 
 23 BITMAP MOVEABLE PURE LOADONCALL DISCARDABLE "Bitmaps\file0013.BMP"
 24 BITMAP MOVEABLE PURE LOADONCALL DISCARDABLE "file0014.BMP"
 25 BITMAP MOVEABLE PURE LOADONCALL DISCARDABLE "file0015.BMP"

  101 DIALOGEX 10,10,200,140,0
  STYLE DS_MODALFRAME | 0x0004 | DS_CENTER | WS_CAPTION | 
        WS_SYSMENU | WS_VISIBLE | WS_POPUP
  CAPTION " Conversions"
  FONT 8,"Ms Serif",700,0

BEGIN
    CTEXT  "Programme  de conversion :\nnombres décimaux en valeurs hexadécimales,\nFrancs en Euros et Vice-Versa\n\nPour quitter,cliquer sur la croix, en haut,à droite", -1,10,10,180,48, SS_LEFT | WS_BORDER | 0x00001000,0,0
END

102 DIALOGEX MOVEABLE IMPURE LOADONCALL DISCARDABLE 0,0,161,105

STYLE   0x0004 | DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX |
        WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION " Conversion Déci/Hexa"         
FONT 8, "Courier New",0,1

BEGIN
    EDITTEXT 3000,42,50,108,12,ES_AUTOHSCROLL | ES_LEFT
    EDITTEXT 3001,42,63,108,12,ES_AUTOHSCROLL | ES_LEFT
    DEFPUSHBUTTON "&OK",3002,10,85,55,14,0, ,0
    PUSHBUTTON "&Retour",3004,95,85,55,14,0, ,0
    CTEXT "Les nombres négatif doivent être précédés\n du signe moins (-)",-1,5,5,150,30 ,WS_BORDER | 0x000010000,0,0
    LTEXT "Déci :",301,10,51,27,8 
    LTEXT "Hexa :",300,10,65,27,8
END

;*******************************************************
103 DIALOGEX MOVEABLE IMPURE LOADONCALL DISCARDABLE 0,0,185,105

STYLE  0x0004 | DS_CENTER | WS_CAPTION |WS_MINIMIZEBOX |
 WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION " Conversion Hexa/Déci"         
FONT 8, "Courier New",0,1
BEGIN
    EDITTEXT 3000,42,50,133,12,ES_AUTOHSCROLL | ES_LEFT
    EDITTEXT 3001,42,63,133,12,ES_AUTOHSCROLL | ES_LEFT
    LTEXT "Hexa :",301,10,51,27,8
    LTEXT "Déci :",300,10,65,27,8
    CTEXT "Résultat : Non Signé par défaut.\n64 bits maximum soit 8 octets, séparés ou\n non par un ou plusieurs espaces.",30,5,5,175,35,WS_BORDER | 0x000010000
    DEFPUSHBUTTON      "&OK",3002,5,85,41,13
    PUSHBUTTON      "&Signé",3005,50,85,41,13
    PUSHBUTTON   "&Non Signé",3006,95,85,41,13         ;     2/2
    PUSHBUTTON      "&Retour",3004,140,85,41,13
END

;*******************************************************

104 DIALOGEX MOVEABLE IMPURE LOADONCALL DISCARDABLE  10, 10, 130, 57
STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
 WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Conversion Francs/Euros"
FONT 8, "Courier New",0,1
 
BEGIN
    EDITTEXT         3000,   35,5,95,12, ES_AUTOHSCROLL | ES_LEFT
    EDITTEXT         3001,   35,20,95,12, ES_AUTOHSCROLL | ES_LEFT
    DEFPUSHBUTTON   "&Résultat", 3002,    5,39,40,13   
    PUSHBUTTON      "R&etour", 3004, 85,39,40,13
    LTEXT           "Francs:",302,5,7,27,8
    LTEXT           "Euros:",303,5,22,27,8   

END

;*******************************************************

105 DIALOGEX MOVEABLE IMPURE LOADONCALL DISCARDABLE 10, 10, 130, 57
STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Conversion Euros/Francs"
FONT 8, "Courier New",0,1
 
BEGIN
    EDITTEXT         IDC_EDIT1,   35,5,95,12, ES_AUTOHSCROLL | ES_LEFT
    EDITTEXT         IDC_EDIT2,   35,20,95,12, ES_AUTOHSCROLL | ES_LEFT  
    DEFPUSHBUTTON   "&Résultat", 3002,    5,39,40,13
    PUSHBUTTON      "R&etour", 3004,  85,39,40,13
    LTEXT           "Euros:",302,5,7,27,8
    LTEXT           "Francs:",303,5,22,27,8  

END

;*******************************************************

Conclusion :


Cet utilitaire, écrit il y a quelques années,est sans aucun doute perfectible, mais tel qu'il est il m'a rendu service bien souvent.
à l'époque j'y avoais inclus un petit supplémént concernant les frans -euros et j'avoue que je n'ai pas eu le courage de l'enlever.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.