Генератор функций

Тема в разделе "WASM.BEGINNERS", создана пользователем Semiono, 3 дек 2008.

  1. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    848
    Хочу написать черезвычайно сложную программу! шучу ;)
    Просто помогите собрать всё вместе?
    Суть в том, что нужно чтобы считало:
    440,0 умножить на (корень степени m из числа 2 в степени n);
    где m=11, n = {0,1,2,3... 9,10,11}
    И вывести результат в файл C:\row.txt в виде например, записи "в столбик" или даже не важно,
    лишь бы читабельно было. Результат нужен с округлением до сотых - 1.00 два знака после запятой, больше не нужно, но результат должен быть точным.
    Инструмент - fasmw, ось - win32

    Наверное, надо сначала создать каркас проги которая просто пишет в C:\row.txt ?
    На msdn какие-то вызовы есть же CreateFile, WriteFile ? Я на правильном пути =) ?

    Но далее что-то с лупами замутить, хотя тут наверное алгоритмов несколько бывает?

    И самое страшное, корни и степени! И типы данных... я по тасму для дос читал, нифига не ясно!
    Собсно не знаю какие типы подойдут в этом случае... (всмысле результат до сотых ведь округляю)
    Но и как запятая там указывается, тоже не пойму...
    Может есть примерчики на умножение, корни итп. ? хотяб для tasm ?
    Да даже си попрёт, только не очень хотелось б.

    Пожалуйста, поучаствуйте в "проекте" :]

    PS забыл, ещё лучше бы было зделать интерактивное консоль-приложение, типа чтоб различные m/n можно было задать, но хотя и перекампилить не проблемма в каждый случай...
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    ну смотри. начнем сначала
    CreateFileA - создали/открыли файл
    wsprintfA - перевели числа в строку
    WriteFile - записали
    CloseHandle - закрыли

    Если открыть файл с именем CON будет выводить в консоль

    далее. 2 в степени n это 1 << n
    для фасма
    Код (Text):
    1. mov eax, 1
    2. mov ecx, [n]
    3. shl eax, cl
    а вот с корнями по сложнее. придется мучать FPU
    типа
    Код (Text):
    1. fldln2
    2. push eax
    3. fidiv dword [esp];number
    4. mov [esp], edx
    5. fld1
    6. fyl2y
    7. fidiv dword [esp];power
    8. fabs
    9. fmulp
    10. fldl2e
    11. fmulp
    12. fld st0
    13. frndint
    14. fsub st1, st0
    15. f2xm1
    16. fld1
    17. faddp
    18. fscale
    19. fstp st1
    20. fstp st0
    21. fstp dword [esp]
    ну а теперь все вместе
    Код (Text):
    1. stdcall [CreateFileA], FName, GENERIC_WRITE, 7, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
    2. cmp eax, INVALID_HANDLE_VALUE
    3. jz error
    4. mov ebx, eax
    5. mov ecx, 12;max power + 1
    6. mov eax, 1
    7. shl eax, cl
    8. finit
    9. @@:
    10. shr eax, 1
    11. dec ecx
    12. fldln2
    13. push eax
    14. fild dword [esp];number
    15. mov [esp], edx
    16. fld1
    17. fyl2x
    18. fidiv dword [esp];power
    19. fabs
    20. fmulp
    21. fldl2e
    22. fmulp
    23. fld st0
    24. frndint
    25. fsub st1, st0
    26. f2xm1
    27. fld1
    28. faddp
    29. fscale
    30. fstp st1
    31. fstp st0
    32. fstp dword [esp]
    33. and ecx, ecx
    34. jnz @b
    35. stdcall [wsprintfA], BufferStr, FormatStr
    36. stdcall [WriteFile], ebx, BufferStr, eax, [b]esp, 0[/b];не советую этим злоупотреблять!
    37. stdcall [CloseHandle], ebx
    formatstr:12 times db '%-5.2f', 13, 10

    и все. без оформления, но полностью (еще меточку error поставь и опиши)

    З.Ы. Писал сходу. могут быть не большие глюки (а могут быть и большие алгоритм степени взял по памяти, но по моему он для целых степеней только катит)
     
  3. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    848
    Ура! Спасибо огромное! Такое начало, сразу! +1
    Я правда тупой, может потребоваться продолжение, но пока отлично!
    Кстати, я текст нашёл рульный про
    на pblog.ru про FPU кароче, причём под фасм!!!