0,0 → 1,300 |
;-----------------------------------------------------------------------------+ |
; ãªæ¨ï ¯à¥®¡à §®¢ ¨ï áâப¨ ¢ ¢¥é¥á⢥®¥ ç¨á«® [ 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 |