Работа с дробными числами.

Тема в разделе "WASM.BEGINNERS", создана пользователем Hotwire, 4 фев 2007.

  1. Hotwire

    Hotwire New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    64
    Поддерживает ли TASM 5.0 операции с плавающей точкой? Если да, то как это юзать?
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Hotwire
    Да поддерживает. Читай про FPU.
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Точно также как и в МАСМ32. Тут на сайте есть статьи касательно FPU под МАСМ32. Кстати, ассемблер просто поддерживает мнемоники инструкций FPU, а поддержка самих операций ложится, естественно, на процессор.
     
  4. Hotwire

    Hotwire New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    64
    Что я должен написать после, например,
    mov eax,1.0
    чтобы TASM сказал, что ошибки отсутствуют?
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    mov eax, 1
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Hotwire
    Обычные регистры не работают с плавающей точкой и это не из-за тасм, а из-за проца :)
    Но даже FPU не грузит непосредственно заданные константы - только размещённые в памяти или специальные типа 0.0 - FLDZ, 1.0 - FLD1, 3.14... - FLDPI
    И обрати внимание на директивы\ключи компиляции, а то ТАСМ по умолчанию FPU комманды эмулирует :)
     
  7. Hotwire

    Hotwire New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    64
    А каким образом можно написать подпрограмму для занесения float'ов в EAX (или в
    какой-нибудь другой регистр)?
    Например:
    FLOAT PROC INTEGER:lol: WORD, FRACTION:lol: WORD
    .............
    FLOAT ENDP

    Где можно почитать про FPU?
     
  8. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Hotwire
    Занести то обычный float в eax можно :) только единственное, что с ним там можно сделать - это сохранить в другую переменную :))). А про FPU читай здесь, здесь и вообще привыкай сам поиск юзать.
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    у Григорьева, из новых авторов у Магда вроде что-то есть
     
  10. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Asterix
    У Магда, более чем "что-то" есть. В достаточном объеме,чтобы не задать вопрос подобный тому, что задал автор темы
     
  11. Hotwire

    Hotwire New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    64
    Теперь я прекрасно понял, что сразу надо было писать то, что мне надо.
    Рывшись в статьях по OpenGL'у, напоролся на туториал от Tyler Durden'а. Он использует FASM, а я писал только на TASM'е пятом. Как реализовать такой фрагмент кода на ТАСМе
    invoke glRotatef,[theta],1.0,ebx,ebx
     
  12. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    попробуй явно указать размер dword ptr 1.0
    если не поможет, то
    .data
    _1_0 dd 1.0
    .code
    call glRotatef,[theta],[_1_0],ebx,ebx
    Не слишком изящно, но полюбому сработает.
     
  13. Hotwire

    Hotwire New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    64
    Первый вариант не заработал, а второй прокатил.
    Но очень некрасиво все это выглядит. Других вариантов нет?
     
  14. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Hotwire
    Можешь подглядеть в отладчике или hex редакторе как выглядит нужная константа и использовать её в hex форме.
    Но как показывает практика в рельных прогах FPU контанты (не размещённные в переменных) нужны довольно редко. В основном они требуются в слепленных на скорую руку пробниках. В Masm32 я для этого использую макрос
    Код (Text):
    1. @REAL4 MACRO Fnum
    2. Local Name
    3. .data
    4.   Name dd Fnum
    5. .code
    6.   exitm <Name>
    7. ENDM
    8. glRotatef,[theta],@REAL4(1.0),ebx,ebx
    Или вариант определяющий имя на которе потом можно ссылаться
    Код (Text):
    1. @REAL4 MACRO Name, Fnum
    2. Local Name2
    3. IFB <Fnum>
    4.  .data
    5.     Name2 dd Name
    6.  .code
    7.    exitm <Name2>
    8. ELSE
    9.  .data
    10.     Name dd Fnum
    11.  .code
    12.    exitm <Name>
    13. ENDIF
    14. ENDM
    15. glRotatef,[theta],@REAL4(_1_0, 1.0),ebx,ebx
    16. glRotatef,[theta],[_1_0],ebx,ebx
    Скорее всего это и в TASM прокатит :)
     
  15. Hotwire

    Hotwire New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    64
    Как загружать остальные регистры FPU (кроме ST0)? Согласитесь, что юзать FXCH ST(i) очень тормознуто.
     
  16. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    при помощи fld <операнд>. Каждый fld пропихивает содержимое регистров на один вверх, освобождая st0, в который и производится загрузка операнда. (st6->st7, st5->st6, ... ,st0->st1)
    Просто загружаешь данные в определенном порядке, и всё.
    Кроме того есть fdecstp и fincstp, которые сдвигают указатель на вершину стека (st0), иначе говоря переопределяют имена регистров. Это тоже может оказаться полезным.
    А зачем тебе сразу 8 регистров?
     
  17. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Hotwire
    Читай Edmondа про проектирование FPU кода, а FXCH достаточно хорошо параллелится с другими командами, хотя и есть подводные камни :)

    cresta
    У меня частенько все 8 заполнены либо "в притык", либо приходится выбирать какую переменную оставлять в памяти ;)
     
  18. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Y_Mur
    Имо теоретичекси достаточно 2х регистров, а "8 в притык" это надо постараться ;).
    По идее так должны алгоритмы работы со стеком ФПУ кодироваться - Обратная польская запись
    [edit]
    хотя возможно лучше сначала операнды в стек занести... но будет ли выигрышь?
     
  19. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Если алгоритм продуман, имхо, достаточно 2 - 3 регистра.
     
  20. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    asmfan
    cresta
    Смотря какой алгоритм ;) У меня в цикле на основе одного входного массива может быть построено 2-4 выходных массивов и при этом в стеке и промежуточные данные сидят и постоянно используемые константы туда же разместить очень желательно:)