;-----------------------------------------------------------------------------+
; ãªæ¨ï ¯à¥®¡à §®¢ ¨ï áâப¨ ¢ ¢¥é¥á⢥®¥ ç¨á«® [ by ManHunter / PCL ] |
;-----------------------------------------------------------------------------|
; à ¬¥âàë: |
; lpStr - 㪠§ â¥«ì ¨á室ãî áâப㠢 ä®à¬ ⥠ASCIIZ |
; lpResult - 㪠§ â¥«ì ¯¥à¥¬¥ãî-¯à¨¥¬¨ª § 票ï |
; ¢ë室¥: |
; EAX = 1 - áâப ãá¯¥è® ¯à¥®¡à §®¢ |
; EAX = 0 - áâப ¥ ¬®¦¥â ¡ëâì ¯à¥®¡à §®¢ ¢ ç¨á«® |
;-----------------------------------------------------------------------------+
proc string2float lpStr:DWORD, lpResult:DWORD
; ®ª «ìë¥ ¯¥à¥¬¥ë¥
locals
dot dd ? ; ª § â¥«ì ¤à®¡ãî ç áâì
exp dd ? ; ª § ⥫ì íªá¯®¥âã
digit dd ? ; ¨äà
endl
pusha
; ஢¥àª áâப¨ ¢ «¨¤®áâì
mov [digit],1
mov [exp],0
mov [dot],0
mov esi,[lpStr]
; ¨ãá ¨«¨ ¯«îá ¬®¦¥â ¡ëâì ⮫쪮 ¢ ç «¥
cmp byte [esi],'-'
je @f
cmp byte [esi],'+'
jne .loc_chk_loop
@@:
inc esi
; ®á«¥ § ª ¥ ¬®¦¥â ¡ëâì ã«ï
cmp byte [esi],0
je .loc_chk_error
.loc_chk_loop:
; áâப¥ ¤®«¦ë ¡ëâì æ¨äà, íªá¯®¥â ¨ ¥ ¡®«¥¥ ®¤®© â®çª¨
lodsb
or al,al
jz .loc_chk_complete
cmp al,'e'
je .loc_chk_exp
cmp al,'E'
je .loc_chk_exp
cmp al,'.'
je .loc_chk_dot
cmp al,'0'
jb .loc_chk_error
cmp al,'9'
ja .loc_chk_error
jmp .loc_chk_loop
.loc_chk_dot:
; ®çª ¢ áâப¥ 㦥 ¥áâì?
cmp [dot],0
; âப ¨¬¥¥â ¥ª®à४âë© ä®à¬ â
jne .loc_chk_error
; ªá¯®¥â 㦥 ¥áâì?
cmp [exp],0
; âப ¨¬¥¥â ¥ª®à४âë© ä®à¬ â
jne .loc_chk_error
; ª § â¥«ì ¤à®¡ãî ç áâì
mov [dot],esi
jmp .loc_chk_loop
.loc_chk_exp:
; ªá¯®¥â 㦥 ¥áâì?
cmp [exp],0
; âப ¨¬¥¥â ¥ª®à४âë© ä®à¬ â
jne .loc_chk_error
; ª § ⥫ì ç «® íªá¯®¥âë
mov [exp],esi
; à §ã ¯®á«¥ íªá¯®¥âë ¥ ¬®¦¥â ¡ëâì ã«ï
cmp byte [esi],0
je .loc_chk_error
; ®á«¥ íªá¯®¥âë ¬®¦¥â ¡ëâì § ª
cmp byte [esi],'-'
je @f
cmp byte [esi],'+'
jne .loc_chk_loop
@@:
inc esi
; à §ã ¯®á«¥ ¬¨ãá ¥ ¬®¦¥â ¡ëâì ã«ï
cmp byte [esi],0
je .loc_chk_error
; ஢¥à¨âì á«¥¤ãî騩 ᨬ¢®«
jmp .loc_chk_loop
.loc_chk_error:
; âப ¥ ï¥âáï ç¨á«®¬
mov [digit],0
jmp .loc_ret
.loc_chk_complete:
; ¨æ¨ «¨§ æ¨ï ᮯà®æ¥áá®à
finit
; ç «ì®¥ § 票¥ ç¨á«
fldz
; ®¦¨â¥«ì ¨ ¤¥«¨â¥«ì
mov [digit],10
fild dword [digit]
; ¯¨áì § 票© ¤® § ¯ï⮩
mov esi,[lpStr]
; ç «¥ áâப¨ ¬¨ãá?
cmp byte [esi],'-'
je @f
cmp byte [esi],'+'
jne .loc_before_dot
@@:
inc esi
; ८¡à §®¢ ¨¥ ç¨á« ¤® § ¯ï⮩
.loc_before_dot:
lodsb
; ®¥æ áâப¨?
or al,al
jz .loc_complete
cmp al,'.'
je .loc_complete_before_dot
cmp al,'e'
je .loc_exp
cmp al,'E'
je .loc_exp
; ç¥à¥¤ ï æ¨äà
sub al,'0'
movzx eax,al
mov [digit],eax
; ¯¨á âì
fild dword [digit]
fxch st2
fmul st0,st1
fxch st2
fadd st2,st0
ffree st0 ; ®ç¨áâ¨âì á⥪
fincstp
jmp .loc_before_dot
; ८¡à §®¢ ¨¥ ¤à®¡®© ç á⨠ç¨á«
.loc_complete_before_dot:
; ஡ ï ç áâì ¥áâì?
cmp [dot],0
je .loc_complete_after_dot
; ªá¯®¥â ¥áâì?
cmp [exp],0
je @f
; ª § ⥫ì ç «® íªá¯®¥âë
mov esi,[exp]
jmp .loc_start_after_dot
@@:
; ç¥ ¯¥à¥¥á⨠㪠§ â¥«ì ª®¥æ áâப¨
xor ecx,ecx
dec ecx
xor eax,eax
mov edi,esi
repne scasb
mov esi,edi
.loc_start_after_dot:
std
dec esi
dec esi
; ஡ ï ç áâì
fldz
fxch st1
.loc_after_dot:
lodsb
; ®¥æ ¤à®¡®© ç áâ¨?
cmp al,'.'
je .loc_complete_after_dot
; ç¥à¥¤ ï æ¨äà
sub al,'0'
movzx eax,al
mov [digit],eax
; ¯¨á âì
fild dword [digit]
fadd st2,st0
fxch st2
fdiv st0,st1
fxch st2
ffree st0 ; ®ç¨áâ¨âì á⥪
fincstp
jmp .loc_after_dot
.loc_complete_after_dot:
; ¡à®á¨âì ä« £ ¯à ¢«¥¨ï
cld
ffree st0 ; ®ç¨áâ¨âì á⥪
fincstp
; «®¦¨âì ¤à®¡ãî ¨ 楫ãî ç áâì
fadd st1,st0
.loc_exp:
; ªá¯®¥â ¥áâì?
cmp [exp],0
je .loc_complete
; ®«ãç¨âì § 票¥ íªá¯®¥âë
xor ecx,ecx
mov esi,[exp]
; ç «¥ áâப¨ ¬¨ãá?
cmp byte [esi],'-'
je @f
cmp byte [esi],'+'
jne .loc_start_exp
@@:
inc esi
.loc_start_exp:
lodsb
or al,al
jz .loc_end_exp
sub al,'0'
movzx eax,al
imul ecx,10
add ecx,eax
jmp .loc_start_exp
.loc_end_exp:
or ecx,ecx
jz .loc_complete
ffree st0 ; ®ç¨áâ¨âì á⥪
fincstp
mov [digit],10
fild dword [digit]
; ¥«¨âì ¨«¨ 㬮¦ âì?
mov esi,[exp]
cmp byte [esi],'-'
je .loc_exp_divide
.loc_exp_multiple:
fmul st1,st0
loop .loc_exp_multiple
jmp .loc_complete
.loc_exp_divide:
fdiv st1,st0
loop .loc_exp_divide
.loc_complete:
ffree st0 ; ®ç¨áâ¨âì á⥪
fincstp
; ç «¥ áâப¨ ¬¨ãá?
mov esi,[lpStr]
cmp byte [esi],'-'
jne @f
; §¬¥¨âì § ª ç¨á«
fchs
@@:
; ¯¨á âì § 票¥ ¢ ï祩ªã ¯ ¬ïâ¨
mov eax,[lpResult]
;
᫨ âॡã¥âáï ¯®¢ëè¥ ï â®ç®áâì, â® ¯à¨¥¬¨ª
; ¤®«¦¥ ¨¬¥âì à §¬¥à QWORD, á«¥¤ãîéãî ª®¬ ¤ã
; ¤® § ¬¥¨âì fstp qword [eax]
fstp tword [eax]
; ᯥ讥 ¯à¥®¡à §®¢ ¨¥
mov [digit],1
.loc_ret:
popa
; ¥§ã«ìâ ⠯८¡à §®¢ ¨ï
mov eax,[digit]
ret
endp