Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ;-----------------------------------------------------------------------------+
  2. ; ”ã­ªæ¨ï ¯à¥®¡à §®¢ ­¨ï áâப¨ ¢ ¢¥é¥á⢥­­®¥ ç¨á«® [ by ManHunter / PCL ]   |
  3. ;-----------------------------------------------------------------------------|
  4. ;  à ¬¥âàë:                                                                  |
  5. ;   lpStr - 㪠§ â¥«ì ­  ¨á室­ãî áâப㠢 ä®à¬ â¥ ASCIIZ                     |
  6. ;   lpResult - 㪠§ â¥«ì ­  ¯¥à¥¬¥­­ãî-¯à¨¥¬­¨ª §­ ç¥­¨ï                      |
  7. ;   ¢ë室¥:                                                                  |
  8. ;   EAX = 1 - áâப  ãᯥ譮 ¯à¥®¡à §®¢ ­                                     |
  9. ;   EAX = 0 - áâப  ­¥ ¬®¦¥â ¡ëâì ¯à¥®¡à §®¢ ­  ¢ ç¨á«®                      |
  10. ;-----------------------------------------------------------------------------+
  11. proc    string2float lpStr:DWORD, lpResult:DWORD
  12.     ; ‹®ª «ì­ë¥ ¯¥à¥¬¥­­ë¥
  13.     locals
  14.       dot    dd ?   ; “ª § â¥«ì ­  ¤à®¡­ãî ç áâì
  15.       exp    dd ?   ; “ª § â¥«ì ­  íªá¯®­¥­âã
  16.       digit  dd ?   ; –¨äà 
  17.     endl
  18.  
  19.     pusha
  20.  
  21.     ; à®¢¥àª  áâப¨ ­  ¢ «¨¤­®áâì
  22.     mov     [digit],1
  23.  
  24.     mov     [exp],0
  25.     mov     [dot],0
  26.     mov     esi,[lpStr]
  27.     ; Œ¨­ãá ¨«¨ ¯«îá ¬®¦¥â ¡ëâì ⮫쪮 ¢ ­ ç «¥
  28.     cmp     byte [esi],'-'
  29.     je      @f
  30.     cmp     byte [esi],'+'
  31.     jne     .loc_chk_loop
  32. @@:
  33.     inc     esi
  34.  
  35.     ; ®á«¥ §­ ª  ­¥ ¬®¦¥â ¡ëâì ­ã«ï
  36.     cmp     byte [esi],0
  37.     je      .loc_chk_error
  38. .loc_chk_loop:
  39.     ; ‚ áâப¥ ¤®«¦­ë ¡ëâì æ¨äà, íªá¯®­¥­â  ¨ ­¥ ¡®«¥¥ ®¤­®© â®çª¨
  40.     lodsb
  41.     or      al,al
  42.     jz      .loc_chk_complete
  43.     cmp     al,'e'
  44.     je      .loc_chk_exp
  45.     cmp     al,'E'
  46.     je      .loc_chk_exp
  47.     cmp     al,'.'
  48.     je      .loc_chk_dot
  49.     cmp     al,'0'
  50.     jb      .loc_chk_error
  51.     cmp     al,'9'
  52.     ja      .loc_chk_error
  53.     jmp     .loc_chk_loop
  54.  
  55. .loc_chk_dot:
  56.     ; ’®çª  ¢ áâப¥ 㦥 ¥áâì?
  57.     cmp     [dot],0
  58.     ; ‘âப  ¨¬¥¥â ­¥ª®à४â­ë© ä®à¬ â
  59.     jne     .loc_chk_error
  60.  
  61.     ; ªá¯®­¥­â  㦥 ¥áâì?
  62.     cmp     [exp],0
  63.     ; ‘âப  ¨¬¥¥â ­¥ª®à४â­ë© ä®à¬ â
  64.     jne     .loc_chk_error
  65.  
  66.     ; “ª § â¥«ì ­  ¤à®¡­ãî ç áâì
  67.     mov     [dot],esi
  68.  
  69.     jmp     .loc_chk_loop
  70.  
  71. .loc_chk_exp:
  72.     ; ªá¯®­¥­â  㦥 ¥áâì?
  73.     cmp     [exp],0
  74.     ; ‘âப  ¨¬¥¥â ­¥ª®à४â­ë© ä®à¬ â
  75.     jne     .loc_chk_error
  76.  
  77.     ; “ª § â¥«ì ­  ­ ç «® íªá¯®­¥­âë
  78.     mov     [exp],esi
  79.  
  80.     ; ‘ࠧ㠯®á«¥ íªá¯®­¥­âë ­¥ ¬®¦¥â ¡ëâì ­ã«ï
  81.     cmp     byte [esi],0
  82.     je      .loc_chk_error
  83.  
  84.     ; ®á«¥ íªá¯®­¥­âë ¬®¦¥â ¡ëâì §­ ª
  85.     cmp     byte [esi],'-'
  86.     je      @f
  87.     cmp     byte [esi],'+'
  88.     jne     .loc_chk_loop
  89. @@:
  90.     inc     esi
  91.  
  92.     ; ‘ࠧ㠯®á«¥ ¬¨­ãá  ­¥ ¬®¦¥â ¡ëâì ­ã«ï
  93.     cmp     byte [esi],0
  94.     je      .loc_chk_error
  95.  
  96.     ; à®¢¥à¨âì á«¥¤ãî騩 ᨬ¢®«
  97.     jmp     .loc_chk_loop
  98.  
  99. .loc_chk_error:
  100.     ; ‘âப  ­¥ ï¥âáï ç¨á«®¬
  101.     mov     [digit],0
  102.     jmp     .loc_ret
  103.  
  104. .loc_chk_complete:
  105.     ; ˆ­¨æ¨ «¨§ æ¨ï ᮯà®æ¥áá®à 
  106.     finit
  107.  
  108.     ;  ç «ì­®¥ §­ ç¥­¨¥ ç¨á« 
  109.     fldz
  110.  
  111.     ; Œ­®¦¨â¥«ì ¨ ¤¥«¨â¥«ì
  112.     mov     [digit],10
  113.     fild    dword [digit]
  114.  
  115.     ; ‡ ¯¨áì §­ ç¥­¨© ¤® § ¯ï⮩
  116.     mov     esi,[lpStr]
  117.  
  118.     ; ‚ ­ ç «¥ áâப¨ ¬¨­ãá?
  119.     cmp     byte [esi],'-'
  120.     je      @f
  121.     cmp     byte [esi],'+'
  122.     jne     .loc_before_dot
  123. @@:
  124.     inc     esi
  125.     ; à¥®¡à §®¢ ­¨¥ ç¨á«  ¤® § ¯ï⮩
  126. .loc_before_dot:
  127.     lodsb
  128.     ; Š®­¥æ áâப¨?
  129.     or      al,al
  130.     jz      .loc_complete
  131.  
  132.     cmp     al,'.'
  133.     je      .loc_complete_before_dot
  134.     cmp     al,'e'
  135.     je      .loc_exp
  136.     cmp     al,'E'
  137.     je      .loc_exp
  138.  
  139.     ; Žç¥à¥¤­ ï æ¨äà 
  140.     sub     al,'0'
  141.     movzx   eax,al
  142.     mov     [digit],eax
  143.  
  144.     ; ‡ ¯¨á âì
  145.     fild    dword [digit]
  146.     fxch    st2
  147.     fmul    st0,st1
  148.     fxch    st2
  149.     fadd    st2,st0
  150.  
  151.     ffree   st0     ; ®ç¨áâ¨âì á⥪
  152.     fincstp
  153.  
  154.     jmp     .loc_before_dot
  155.  
  156.     ; à¥®¡à §®¢ ­¨¥ ¤à®¡­®© ç á⨠ç¨á« 
  157. .loc_complete_before_dot:
  158.     ; „஡­ ï ç áâì ¥áâì?
  159.     cmp     [dot],0
  160.     je      .loc_complete_after_dot
  161.  
  162.     ; ªá¯®­¥­â  ¥áâì?
  163.     cmp     [exp],0
  164.     je      @f
  165.  
  166.     ; “ª § â¥«ì ­  ­ ç «® íªá¯®­¥­âë
  167.     mov     esi,[exp]
  168.     jmp     .loc_start_after_dot
  169. @@:
  170.     ; ˆ­ ç¥ ¯¥à¥­¥á⨠㪠§ â¥«ì ­  ª®­¥æ áâப¨
  171.     xor     ecx,ecx
  172.     dec     ecx
  173.     xor     eax,eax
  174.     mov     edi,esi
  175.     repne   scasb
  176.  
  177.     mov     esi,edi
  178.  
  179. .loc_start_after_dot:
  180.     std
  181.     dec     esi
  182.     dec     esi
  183.  
  184.     ; „஡­ ï ç áâì
  185.     fldz
  186.     fxch    st1
  187. .loc_after_dot:
  188.     lodsb
  189.     ; Š®­¥æ ¤à®¡­®© ç áâ¨?
  190.     cmp     al,'.'
  191.     je      .loc_complete_after_dot
  192.  
  193.     ; Žç¥à¥¤­ ï æ¨äà 
  194.     sub     al,'0'
  195.     movzx   eax,al
  196.     mov     [digit],eax
  197.  
  198.     ; ‡ ¯¨á âì
  199.     fild    dword [digit]
  200.     fadd    st2,st0
  201.     fxch    st2
  202.     fdiv    st0,st1
  203.     fxch    st2
  204.  
  205.     ffree   st0     ; ®ç¨áâ¨âì á⥪
  206.     fincstp
  207.  
  208.     jmp     .loc_after_dot
  209.  
  210. .loc_complete_after_dot:
  211.     ; ‘¡à®á¨âì ä« £ ­ ¯à ¢«¥­¨ï
  212.     cld
  213.  
  214.     ffree   st0     ; ®ç¨áâ¨âì á⥪
  215.     fincstp
  216.  
  217.     ; ‘«®¦¨âì ¤à®¡­ãî ¨ 楫ãî ç áâì
  218.     fadd    st1,st0
  219.  
  220. .loc_exp:
  221.     ; ªá¯®­¥­â  ¥áâì?
  222.     cmp     [exp],0
  223.     je      .loc_complete
  224.  
  225.     ; ®«ãç¨âì §­ ç¥­¨¥ íªá¯®­¥­âë
  226.     xor     ecx,ecx
  227.  
  228.     mov     esi,[exp]
  229.     ; ‚ ­ ç «¥ áâப¨ ¬¨­ãá?
  230.     cmp     byte [esi],'-'
  231.     je      @f
  232.     cmp     byte [esi],'+'
  233.     jne     .loc_start_exp
  234. @@:
  235.     inc     esi
  236. .loc_start_exp:
  237.     lodsb
  238.     or      al,al
  239.     jz      .loc_end_exp
  240.  
  241.     sub     al,'0'
  242.     movzx   eax,al
  243.     imul    ecx,10
  244.     add     ecx,eax
  245.  
  246.     jmp     .loc_start_exp
  247. .loc_end_exp:
  248.  
  249.     or      ecx,ecx
  250.     jz      .loc_complete
  251.  
  252.     ffree   st0     ; ®ç¨áâ¨âì á⥪
  253.     fincstp
  254.  
  255.     mov     [digit],10
  256.     fild    dword [digit]
  257.  
  258.     ; „¥«¨âì ¨«¨ 㬭®¦ âì?
  259.     mov     esi,[exp]
  260.     cmp     byte [esi],'-'
  261.     je      .loc_exp_divide
  262.  
  263. .loc_exp_multiple:
  264.     fmul    st1,st0
  265.     loop    .loc_exp_multiple
  266.     jmp     .loc_complete
  267.  
  268. .loc_exp_divide:
  269.     fdiv    st1,st0
  270.     loop    .loc_exp_divide
  271.  
  272. .loc_complete:
  273.     ffree   st0     ; ®ç¨áâ¨âì á⥪
  274.     fincstp
  275.  
  276.     ; ‚ ­ ç «¥ áâப¨ ¬¨­ãá?
  277.     mov     esi,[lpStr]
  278.     cmp     byte [esi],'-'
  279.     jne     @f
  280.  
  281.     ; ˆ§¬¥­¨âì §­ ª ç¨á« 
  282.     fchs
  283. @@:
  284.     ; ‡ ¯¨á âì §­ ç¥­¨¥ ¢ ï祩ªã ¯ ¬ïâ¨
  285.     mov     eax,[lpResult]
  286.     ; …᫨ âॡã¥âáï ¯®¢ë襭­ ï â®ç­®áâì, â® ¯à¨¥¬­¨ª
  287.     ; ¤®«¦¥­ ¨¬¥âì à §¬¥à QWORD,   á«¥¤ãîéãî ª®¬ ­¤ã
  288.     ; ­ ¤® § ¬¥­¨âì ­  fstp qword [eax]
  289.     fstp    tword [eax]
  290.  
  291.     ; “ᯥ譮¥ ¯à¥®¡à §®¢ ­¨¥
  292.     mov     [digit],1
  293. .loc_ret:
  294.     popa
  295.  
  296.     ; ¥§ã«ìâ â ¯à¥®¡à §®¢ ­¨ï
  297.     mov     eax,[digit]
  298.  
  299.     ret
  300. endp