0,0 → 1,305 |
;-----------------------------------------------------------------------------+ |
; ãªæ¨ï ¯¥à¥¢®¤ ¢¥é¥á⢥®£® ç¨á« ¢ áâபã [ by ManHunter / PCL ] | |
;-----------------------------------------------------------------------------| |
; à ¬¥âàë: | |
; lpFloat - 㪠§ â¥«ì ¢¥é¥á⢥®¥ ç¨á«® TBYTE | |
; lpResult - 㪠§ ⥫ì áâபã-¯à¨¥¬¨ª १ã«ìâ â | |
;-----------------------------------------------------------------------------+ |
|
proc FloatToString lpFloat:DWORD, lpResult:DWORD |
; ®ª «ìë¥ ¯¥à¥¬¥ë¥ |
local digits_count:DWORD |
local old_cw:WORD |
local new_cw:WORD |
local saved_float:TBYTE |
local tmp1 rb 11h |
local tmp2 rb 11h |
|
; ®åà ¨âì ¢á¥ à¥£¨áâàë |
pusha |
|
; ª § ⥫ì áâபã-¯à¨¥¬¨ª |
mov edi,[lpResult] |
|
; â® ®«ì? |
lea esi,[lpFloat] |
cmp dword [esi],0 |
jne loc_not_zero |
cmp dword [esi+4],0 |
jne loc_not_zero |
cmp word [esi+8],0 |
jne loc_not_zero |
; ¯¨á âì ¢ áâப㠮«ì |
mov al,'0' |
stosb |
jmp loc_ret |
|
loc_not_zero: |
; ª®¯¨à®¢ âì ç¨á«® ¢ «®ª «ìãî ¯¥à¥¬¥ãî |
push edi |
mov esi,[lpFloat] |
lea edi,[saved_float] |
movsd |
movsd |
movsw |
pop edi |
; ¨á«® ®âà¨æ ⥫쮥? |
cmp dword [saved_float+6],0 |
jge loc_not_signed |
; ਢ¥á⨠ç¨á«® ª ¡á®«î⮬㠧 票î |
and byte [saved_float+9],7Fh |
; ¯¨á âì ¢ áâப㠬¨ãá |
mov al,'-' |
stosb |
|
loc_not_signed: |
; ஢¥à¨âì ç¨á«® «¨ç¨¥ ¤à®¡®© ç á⨠¨ |
; ¯®¤áç¨â âì ª®«¨ç¥á⢮ æ¨äà ¢ ¥¬ |
fclex |
; ®åà ¨âì ã¯à ¢«ïî饥 á«®¢® |
fstcw [old_cw] |
; áâ ®¢¨âì ã¯à ¢«ïî饥 á«®¢® |
mov [new_cw],0000001001111111b |
fldcw [new_cw] |
lea esi,[saved_float] |
fld tbyte [esi] |
fld st |
; 뤥«¨âì ¬ â¨ááã ¨ ¯®à冷ª |
fxtract |
fstp st |
fldlg2 |
; ®«ãç¨âì ª®«¨ç¥á⢮ æ¨äà ¢ ç¨á«¥ |
fmulp st1,st |
fistp [digits_count] |
;
᫨ æ¨äà ¡®«ìè¥ 16, â® ç¨á«® ®â®¡à ¦ ¥âáï ¢ |
; ®à¬ «¨§®¢ ®¬ ¢¨¤¥ á ¬ â¨áᮩ ¨ íªá¯®¥â®© |
cmp [digits_count],10h |
jnb loc_not_integer |
; ç¨á« ¥áâì ¤à®¡ ï ç áâì? |
fld st |
frndint |
fcomp st1 |
fstsw ax |
test ah,01000000b |
; , ®â®¡à ¦ âì ç¨á«® á ¤à®¡®© ç áâìî |
jz loc_not_integer |
|
; ¥«®¥ ç¨á«® ¡¥§ ¤à®¡®© ç á⨠¨ íªá¯®¥âë |
lea eax,[tmp1] |
fbstp [eax] |
|
; ¥à¥¢¥á⨠BCD-ç¨á«® ¢ áâபã |
push edi |
lea esi,[tmp1+8] |
lea edi,[tmp2] |
mov ecx, 9 |
@@: |
std |
xor eax,eax |
lodsb |
cld |
rol ax,12 |
rol ah,4 |
add ax,'00' |
stosw |
loop @b |
pop edi |
|
; யãáâ¨âì «¨¤¨àãî騩 ®«ì |
mov eax,11h |
mov ecx,[digits_count] |
sub eax,ecx |
inc ecx |
lea esi,[tmp2+eax] |
cmp byte [esi],'0' |
jne @f |
inc esi |
dec ecx |
@@: |
; ¥à¥¥á⨠¯®«ã祮¥ ç¨á«® ¨§ ¢à¥¬¥®£® ¡ãä¥à |
rep movsb |
jmp loc_clear_stack |
|
loc_not_integer: |
mov eax,10h |
sub eax,[digits_count] |
|
; ८¡à §®¢ âì ç¨á«® ¢ 楫®¥ ¤® 16 à §à冷¢ |
mov ecx,eax |
cmp eax,0 |
jge @f |
neg eax |
@@: |
; «ï ç¨á¥« ¡®«ìè¥ 0 ª®à४â¨à®¢ª ®ªà㣫¥¨ï ¢ áâ®à®ã 0 |
mov [new_cw],0000101001111111b |
cmp ecx,0 |
jge @f |
mov [new_cw],0000011001111111b |
@@: |
; áâ ®¢¨âì ã¯à ¢«ïî饥 á«®¢® |
fldcw [new_cw] |
|
; ®§¢¥á⨠10 ¢ á⥯¥ì ª®«¨ç¥á⢠æ¨äà |
fld [float2] |
fld [float2] |
@@: |
fmul st,st1 |
dec eax |
cmp eax,1 |
ja @b |
|
; ®ç¨áâ¨âì á⥪ |
fxch st1 |
fstp st |
|
;
᫨ ç¨á«® ¬¥ìè¥ 0, ⮠㬮¦¨âì, ¨ ç¥ à §¤¥«¨âì |
cmp ecx,0 |
jge @f |
fdivp st1,st |
jmp loc_rounded |
@@: |
fmulp st1,st |
|
loc_rounded: |
; ®«ã祮¥ § 票¥ ¬¥ìè¥ 1.0e16 ? |
fcom [float1] |
fstsw ax |
test ah,1 |
jz @f |
fmul [float2] |
dec [digits_count] |
@@: |
; ¥«®¥ ç¨á«® ¡¥§ ¤à®¡®© ç á⨠¨ íªá¯®¥âë |
lea eax,[tmp1] |
fbstp [eax] |
|
; ¥à¥¢¥á⨠BCD-ç¨á«® ¢ áâபã |
push edi |
lea esi,[tmp1+8] |
lea edi,[tmp2] |
mov ecx, 9 |
@@: |
std |
xor eax,eax |
lodsb |
cld |
rol ax,12 |
rol ah,4 |
add ax,'00' |
stosw |
loop @b |
pop edi |
|
; ¨á«ã âॡã¥âáï ¬ â¨áá ¨ íªá¯®¥â ? |
lea esi,[tmp2+1] |
mov ecx,[digits_count] |
cmp ecx,-0Fh |
jl loc_mantiss_and_exponent |
cmp ecx,10h |
jg loc_mantiss_and_exponent |
|
; ¯®«¨âì ¤à®¡ãî ç áâì ç¨á« |
inc ecx |
cmp ecx,0 |
jg @f |
mov ax,'0.' |
stosw |
neg ecx |
mov al,'0' |
rep stosb |
mov ecx,10h |
jmp loc_fraction_filled |
@@: |
rep movsb |
mov al,'.' |
stosb |
mov ecx,10h |
sub ecx,[digits_count] |
|
loc_fraction_filled: |
rep movsb |
jmp @f |
|
loc_clear_fraction: |
; ¤ «¨âì § ¢¥àè î騥 㫨 ¤à®¡®© ç á⨠|
dec edi |
@@: |
cmp byte [edi-1],'0' |
jz loc_clear_fraction |
cmp byte [edi-1],'.' |
jnz @f |
dec edi |
@@: |
jmp loc_clear_stack |
|
loc_mantiss_and_exponent: |
; ஡ ï ç áâì ¬ â¨ááë |
movsb |
mov al,'.' |
stosb |
movsd |
movsd |
movsw |
; ¤ «¨âì § ¢¥àè î騥 㫨 ¤à®¡®© ç á⨠|
@@: |
cmp byte [edi-1],'0' |
jne @f |
cmp byte [edi-2],'.' |
je @f |
dec edi |
jmp @b |
@@: |
; ¨¬¢®« ¨ § ª íªá¯®¥âë |
mov al,'e' |
stosb |
mov al,'+' |
mov ebx,[digits_count] |
cmp ebx, 0 |
jge @f |
mov al,'-' |
neg ebx |
@@: |
stosb |
|
; 票¥ íªá¯®¥âë |
mov eax,ebx |
mov ecx,10 |
mov ebx,4 |
@@: |
dec ebx |
xor edx,edx |
div ecx |
add dl,'0' |
mov [tmp1+ebx],dl |
or ebx,ebx |
jnz @b |
|
; யãáâ¨âì «¨¤¨àãî騥 㫨 íªá¯®¥âë |
mov ecx,4 |
lea esi,[tmp1] |
@@: |
lodsb |
cmp al,'0' |
jne @f |
dec ecx |
jmp @b |
@@: |
dec esi |
rep movsb |
|
loc_clear_stack: |
; ®ááâ ®¢¨âì ã¯à ¢«ïî饥 á«®¢® |
fldcw [old_cw] |
loc_ret: |
; ª®ç ¨¥ áâப¨ |
mov al,0 |
stosb |
|
; ®ááâ ®¢¨âì ¢á¥ à¥£¨áâàë |
popa |
ret |
|
float1 dq 1.0e16 |
float2 dq 10.0 |
|
endp |