Floattohex code de brunews retrenscris en asm par moi

Soyez le premier à donner votre avis sur cette source.

Vue 6 670 fois - Téléchargée 509 fois

Description

convertis nombre reel en simple et double hexadecimal
petit utilitaire pour dévelopeur trés utile avec masm32
parceque l'on ne peut pas mettre un float literalement
sur la pile.
ex: push 1.5f ;erreur
push 3FC00000h ;ok
fld dword ptr [esp]
add esp,4
ainsi il n'est pas obligatoire de definir une variable
! ATTENTION Ce programme utilise des instructions SSE2
1 - il faut savoir si votre proc comporte le jeux d'instruction SSE2
2 - pour compiler il faut remplacer le ml.exe d'origine avec celui
qui ce trouve dans le ZIP,ou dans SP5 qui ce trouve à l'addresse
http://mirror.href.com/thestarman/asm/masm.htm.
Sinon il ne reconnaitra pas la syntaxe xmm.
Ce code peut être un BON didactel pour SSE2

Source / Exemple :


.686p
.model flat,stdcall
option casemap:none
.xmm

include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32
includelib user32.lib

AppDlgProc			PROTO :HWND,:UINT,:WPARAM,:LPARAM 
ProcEdFloat    			PROTO :HWND,:UINT,:WPARAM,:LPARAM 
FloatsToHex                     PROTO

.CONST

IDD_APP                         EQU	101
IDI_APP                         EQU	102
ID_TXT                          EQU	1001
ID_DBL                          EQU	1002
ID_FLT 				EQU     1003

.DATA
;ALIGN 16
BNDIXPZERO  			dq      4024000000000000h
BNUNDIXIEM 			dq	3FB999999999999Ah
BNMINUSDBL 			dq	8000000000000000h

 	 hdbl 			dd 0
         hflt			dd 0
         htxt			dd 0
	 oldFloatProc		dd 0

.CODE
START:	INVOKE			DialogBoxParam,400000h,101,0,addr AppDlgProc,400000h
        INVOKE			ExitProcess,0

;################################################## AppDlgProc ####################################################################

AppDlgProc			PROC   hdlg:HWND,msg:UINT,wParam:WPARAM,lParam:LPARAM 
	mov    			eax,msg
        cmp    			eax,WM_INITDIALOG
        je     			WMINIT
        cmp    			eax,WM_COMMAND
        je     			WMCMD
        jmp			DLG
WMINIT:	INVOKE    		LoadIcon,400000h,IDI_APP
    	INVOKE			SetClassLong,hdlg,GCL_HICON,eax
        INVOKE			GetDlgItem,hdlg,ID_TXT
        mov			htxt,eax
        INVOKE			SendMessage,eax, EM_LIMITTEXT, 15, 0
        INVOKE			SetWindowLong,htxt, GWL_WNDPROC,ADDR ProcEdFloat
        mov			oldFloatProc,eax
	INVOKE			GetDlgItem,hdlg,ID_DBL
      	mov			hdbl,eax		
      	INVOKE			GetDlgItem,hdlg,ID_FLT
      	mov			hflt,eax
        jmp                     DLG
WMCMD:  mov			eax,wParam
        and                     eax,0FFFFh
        cmp                     eax,IDOK
        jnz                     @F
        INVOKE			FloatsToHex
        jmp                     DLG
@@:     cmp			eax,IDCANCEL
        jnz                     DLG
        INVOKE			EndDialog,hdlg,0        
DLG:  	sub 			eax,eax
      	ret
AppDlgProc			ENDP

;##################################################### ProcEdFloat #############################################################

ProcEdFloat    			PROC hwnd:HWND,msg:UINT,wParam:WPARAM,lParam:LPARAM 
	LOCAL 			buf[16]:BYTE
        mov			eax,msg
        cmp			eax,WM_CHAR
        je			WMCHAR
        jmp			DEFRET
WMCHAR:	mov                     eax,wParam
        cmp			eax,VK_BACK
        je                      DEFRET
        cmp                     eax,57
        jg                      NOGOOD
        cmp                     eax,48
        jge                     DEFRET
        cmp                     eax,44
        jl                      NOGOOD
        cmp                     eax,46
        jg                      NOGOOD
        cmp                     eax,45
        jge                     GVERIF
        mov                     wParam,46
GVERIF:	INVOKE			GetWindowText,hwnd,addr buf, 16
        lea			edi,buf
        mov			ecx,eax
        mov                     eax,wParam
        repne                   scasb
        jne                     DEFRET
NOGOOD: sub			eax,eax
        ret
DEFRET: INVOKE			CallWindowProc,oldFloatProc, hwnd, msg, wParam, lParam
        ret
ProcEdFloat			ENDP

;########################################################### FloatsToHex #########################################################

FloatsToHex 			PROC
	sub       		esp, 32
    	mov       		ecx, 16
    	mov       		eax, esp
    	INVOKE 			GetWindowText,htxt,eax,16
    	mov       		ecx, esp
    	call      		bnatod
	DB      0F2h,0Fh,11h,44h,24h,14h  ;movsd     qword ptr[esp+20],XMM0
        cvtsd2ss		XMM2,XMM0
    	mov       		edx, esp
    	mov       		ecx, dword ptr[esp+24]
    	call      		bndwordtox
    	mov       		edx, eax
    	mov       		ecx, dword ptr[esp+20]
    	call      		bndwordtox
    	push      		esp
    	push      		hdbl
    	call      		SetWindowText
    	movss     		dword ptr[esp+20], XMM2
    	mov       		edx, esp
    	mov       		ecx, dword ptr[esp+20]
    	call      		bndwordtox
    	push      		esp
    	push      		hflt
    	call      	 	SetWindowText
    	add       		esp, 32
        sub                     eax,eax
        ret
FloatsToHex		ENDP

;############################################################ bndwordtox ####################################################
;ECX = dwnum, EDX = szdst
bndwordtox		PROC
	mov       		al, cl
    	add       		edx, 8
    	and       		cl, 15
    	shr       		al, 4
    	add       		cl, 48
    	add       		al, 48
    	cmp       		cl, 57
    	jbe       		short L1
    	add       		cl, 7
L1:	cmp       		al, 57
    	jbe       		short L2
    	add       		al, 7
L2:	mov       		byte ptr[edx-1], cl
    	mov       		byte ptr[edx-2], al
    	shr       		ecx, 8
    	mov       		byte ptr[edx], 0
    	mov       		al, cl
    	and       		cl, 15
    	shr       		al, 4
    	add       		cl, 48
    	add       		al, 48
    	cmp       		cl, 57
    	jbe       		short L3
    	add       		cl, 7
L3:	cmp       		al, 57
    	jbe       		short L4
    	add       		al, 7
L4:	mov       		byte ptr[edx-3], cl
    	mov       		byte ptr[edx-4], al
    	shr       		ecx, 8
    	mov       		al, cl
    	and       		cl, 15
    	shr       		al, 4
    	add       		cl, 48
    	add       		al, 48
    	cmp       		cl, 57
    	jbe       		short L5
    	add       		cl, 7
L5:	cmp       		al, 57
    	jbe       		short L6
    	add       		al, 7
L6:	mov       		byte ptr[edx-5], cl
    	mov       		byte ptr[edx-6], al
    	shr       		ecx, 8
    	mov       		byte ptr[edx], 0
    	mov       		al, cl
    	and       		cl, 15
    	shr       		al, 4
    	add       		cl, 48
    	add       		al, 48
    	cmp       		cl, 57
    	jbe       		short L7
    	add       		cl, 7
L7:	cmp       		al, 57
    	jbe       		short L8
    	add       		al, 7
L8:	mov       		byte ptr[edx-7], cl
    	mov       		byte ptr[edx-8], al
    	mov       		eax, edx
    	ret       
bndwordtox			ENDP

;####################################################### bnatod ###########################################################
;ECX = psz
bnatod				PROC
    	push        		ebx
    	xorps       		XMM0, XMM0
   	DB 0F2h,0Fh,10h,0Dh 	;movsd   XMM1,
        DD OFFSET BNDIXPZERO    ;qword ptr BNDIXPZERO
	xor         		ebx, ebx
    	xor         		edx, edx
    	xor         		eax, eax
    	movapd      		XMM3, XMM0
    	cmp         		byte ptr[ecx], 45
    	jne         		short outZERO
    	add         		ecx, 1
    	add         		ebx, 1
outZERO:mov         		al, [ecx]
    	cmp         		al, 48
    	jne         		short goINT
    	add         		ecx, 1
    	jmp         		short outZERO
goINT:	cmp         		al, 46
    	je          		short goDCML
    	sub         		al, 48
    	js          		short goSIGN
    	cmp         		al, 9
    	ja          		short goSIGN
    	cvtsi2sd    		XMM2, eax
    	mulsd       		XMM0, XMM1
    	add         		ecx, 1
    	addsd       		XMM0, XMM2
    	mov         		al, [ecx]
    	jmp         		short goINT
goDCML:	add         		ecx, 1
    	mov         		al, [ecx]
inDCML:	sub         		al, 48
    	js          		short dcmlIF
    	cmp         		al, 9
    	ja          		short dcmlIF
    	cvtsi2sd    		XMM2, eax
    	mulsd       		XMM0, XMM1
    	add         		ecx, 1
    	add         		edx, 1
    	addsd       		XMM0, XMM2
    	mov         		al, [ecx]
    	jmp         		short inDCML
dcmlIF:	test        		edx, edx
    	je          		short goSIGN
   	DB 0F2h,0Fh,10h,15h     ;MOVSD   XMM2,
        DD OFFSET BNUNDIXIEM 	;qword ptr BNUNDIXIEM
dcmlADD:sub         		edx, 1
	mulsd       		XMM0, XMM2
    	jne         		short dcmlADD
goSIGN:	comisd      		XMM0, XMM3
    	je          		short atodEXIT
    	test        		ebx, ebx
    	je          		short atodEXIT
	DB 0F2h,0Fh,10h,0Dh	;movsd  XMM1,
	DD OFFSET BNMINUSDBL 	;qword ptr BNMINUSDBL
	subsd       		XMM1, XMM0
    	movapd      		XMM0, XMM1
atodEXIT:
    	pop         		ebx
        sub			eax,eax
    	ret         
bnatod				ENDP

END   				START

Conclusion :


Ce code est de Brunews moi je ne comprend rien
que ce soit pour la routine de convertion
ou que ce soit des instructions SSE2.
J'ai fait que retrenscrire un code pour VC en code pour MASM32.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
116
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
10 avril 2013
1
Salut !

Pour utiliser FLD[src] le float doit déja être en mémoire (à l'adresse src), ce convertisseur permet d'utiliser un float en 'immediate', ou presque... de plus, il pourrait être utile lors de débogage!
Messages postés
69
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
22 mars 2010
1
fst [dest] pour coller en memoire une valeur FP.
mov eax,[dest] pour la mettre dans un registre general 32 bits
push eax pour la mettre sur la pile
-----------------------------------------------------
fld [src] pour charger une valeur FP depuis la memoire vers st0
fIst [dest]pour la convertir en entier 32 bits.
mov eax,[dest] pour la mettre dans un registre general
push eax pour la foutre sur la pile.

voilà

ensuite, pour la syntaxe exacte, je te laisse chercher, je ne code pas en virgule flottante.

vas jeter un coup d'oeil sur http://board.flatassembler.net

et debrouilles toi, c'est ça qui est bon en ASM, trouver par soit meme comment refaire la roue.

:D
Messages postés
11
Date d'inscription
jeudi 26 décembre 2002
Statut
Membre
Dernière intervention
26 mai 2008

FLD[dest] ?????? FLD[src]
Messages postés
11
Date d'inscription
jeudi 26 décembre 2002
Statut
Membre
Dernière intervention
26 mai 2008

Es-ce que tu arrive à poser sur la pile une valeur à virgule flottante
directement, ou charger st avec fld sans pour celà devoir définir
une variable si c'est le cas ça m'interresse de savoir comment.
Messages postés
69
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
22 mars 2010
1
convertir float to hex????
normalement, si je ne m'abuse, il existe deux instructions FPU pour ça.

FLD [dest]
et
FST [dest]

toutes deux vont lire se qui vient de ST0 pour le foutre en memoire, ensuite, cette memoire peut etre lue come bon nous semble, convertie en ascii, en bcd ( d'ailleur il existe une instruction pour convertir le BCD en Float et vice versa) en decimal, etc....
donc, je ne vois pas du tout l'interet de cette usine a gaz.

voilà

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.