Мат сопроцессор для 64 бит

Тема в разделе "WASM.BEGINNERS", создана пользователем sofydone, 2 июл 2005.

  1. sofydone

    sofydone New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2005
    Сообщения:
    31
    Адрес:
    Волгодонск
    Реально ли использовать сопроцессор для 64 арифметики?

    Конкретно, нужно модифицировать FILETIME, допустим на 10 лет назад. Или проще справится процом?

    Если не трудно, немного кода.
     
  2. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia




    Десять лет -- это 0x00011F03C3613000 100-нс интервалов.



    ну а код может быть приблизительно таким:


    Код (Text):
    1.  
    2. mov eax, ft.dwLowDateTime
    3. mov edx, ft.dwHighDateTime
    4. sub eax, C3613000h
    5. sbb edx, 00011F03h
    6.  
     
  3. sofydone

    sofydone New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2005
    Сообщения:
    31
    Адрес:
    Волгодонск
    Да это и так понятно.

    Вопрос-то был про сопроцессор.



    Вот тока не понятно:

    3600 сек * 24 часа * 365 дней * 10 лет * 10000 (100 нс)

    = 3153600000000 = 2DE 41 35 30 00 h

    Что-то не сходится.
     
  4. sofydone

    sofydone New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2005
    Сообщения:
    31
    Адрес:
    Волгодонск
    Ой... сори. Нано - этож 9 нуликов :)
     
  5. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia








    По-моему, я на твой вопрос ответил :) Нафига здесь сопроцессор, если все делается за две инструкции?





    ну и еще в году 365.25 суток :)
     
  6. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Сопроцессор использовать для 64х битной арифметики можно, но нужно учесть некоторые нюансы - FPU оперирует только со знаковыми числами, может возникнуть переполнение и т.п.



    Вот такой код сохраняет по адресу EDI двойное слово и проверяет валидность результата:
    Код (Text):
    1.     fistp QWORD[EDI];
    2.     fnstsw ax
    3.     ror al, 1
    4.     jc  OUTOFRANGE;
    5.     // 0..4294967295 => Ok
    6.     cmp DWORD[EDI+4], 0
    7.     jz OK
    8.     // -2147483648..2147483647 => Ok
    9.     mov EAX, DWORD[EDI]
    10.     add EAX, EAX
    11.     sbb EAX, EAX
    12.     cmp DWORD[EDI+4],EAX
    13.     jnz OUTOFRANGE
    В случае с 64х битным результатом возможности использовать тип unsigned нет совсем.