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.
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.