FASM, экспонента

Тема в разделе "WASM.ASSEMBLER", создана пользователем Basisd, 10 дек 2010.

  1. Basisd

    Basisd New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2010
    Сообщения:
    2
    Здравствуйте! Обращаюсь к вам с такой проблемой. Только недавно начал писать на ФАСМе, опыта ноль. Но надо срочно сделать программу, которая в консоли посчитает exp(x). Есть кое-какие наброски, но никак не пойму, почему значение X не вносится в стек ST0. Помогите пожалуйста исправить код.

    Код (Text):
    1. format PE console
    2. entry start
    3. include 'win32a.inc'
    4.  
    5. section '.data' data readable writeable
    6. ns dd ?
    7. hout dd ?
    8. x dq ?
    9.  
    10. section '.code' code readable executable
    11. start:
    12. invoke GetStdHandle,STD_OUTPUT_HANDLE
    13. mov [hout],eax
    14. invoke GetStdHandle,STD_INPUT_HANDLE
    15. invoke ReadConsole,eax,x,10,ns,NULL
    16.  
    17. finit
    18. fld [x]
    19. fldl2e  ;Log2(E)
    20. fmul st1, st   ;сложение st1 и st0
    21. fld st
    22. frndint ;округляет до ближайшего целого значения, зависящего от текущего режима округления.
    23. fsub st1, st ;вычитает операнд-источник из операнда-адресата
    24. fxch st1  ;меняет местами содержимое регистра ST0 и другого регистра FPU.
    25.           ;Операндом должен служить регистр FPU, а если он не указан, меняются местами регистры ST0 и ST1.
    26.  
    27. f2xm1 ;вычисляет экспоненциальное значение 2 в степени ST0 и вычитает из результата 1.0 (2^x-1),
    28.       ;значение в ST0 должно лежать в пределах от -1.0 до +1.0
    29. fld1  ; загружаем единицу
    30. fadd st1, st ;складывает операнд-источник и операнд-адресат и сохраняет сумму в адресате.
    31. fscale ;оставляет целую часть значения в ST1 и увеличивает экспоненту ST0 на полученное число.
    32. fstp [x]   ;копирует значение из регистра ST0 в операнд-адресат, далее выдвигает стек регистров, освобождая ST0.
    33. mov eax, dword[x]
    34.  
    35. invoke WriteConsole,[hout],x,10,ns,NULL
    36. invoke ExitProcess,0
    37.  
    38. section '.idata' import data readable writeable
    39.  
    40. library kernel32,'kernel32.dll',\
    41. user32, 'user32.dll',\
    42. msvcrt, 'msvcrt.dll'
    43.  
    44. include '\api\kernel32.inc'
    45. include '\api\user32.inc'
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    Basisd
    Раз уж начал бродить по ассемблерным форумам, тогда уж пиши везде одинаково:
    Пишешь курсовик и тут же сообщаешь
     
  3. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Basisd
    Потому что х - строка, а должно быть числом
     
  4. Basisd

    Basisd New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2010
    Сообщения:
    2
    Mikl___, ввиду правил не стал указывать в новой теме, что это курсач...

    max7C4, спасибо)