праверка наличия FPU

Тема в разделе "WASM.OS.DEVEL", создана пользователем abcd008, 7 фев 2011.

  1. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    Я понимаю что fpu сейчас есть во всех процессорах. но все же как определить его наличие?
    я нашел пример:
    Фрагмент кода, следующий ниже, определяет присутствие FPU:

    fninit // сброс статусного слова FPU
    mov [status], 5a5ah // инициализация промежуточного значения
    fnstsw [status] // запомнить статусное слово FPU
    mov ax,[status] // проверка статусного слова FPU
    cmp al,0 // если получено корректное значение
    jne NO_FPU_PRESENT

    fnstcw [status] // сохранить управляющее слово FPU
    mov ax,[status] // проверить управляющее слово FPU
    and ax,103fh // выделить интересующие нас биты
    cmp ax,3fh // проверка
    jne NO_FPU_PRESENT

    может это и работает. у интела почти так же. но интересует момент.
    если нет fpu, как тогда не происходит ошибок при выполнении команд. ведь процессор их не знает?
     
  2. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    под ошибкой понимается- неизвестная команда.
     
  3. artkar

    artkar New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2005
    Сообщения:
    400
    Адрес:
    Russia
    По уму перед тем как его юзать нужно проверить его наличие, если код без проверки начинает юзать сопроцессор, то видимо это просчёт автора.

    Имхо
     
  4. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    я про это и говорю, но такой же код используется в intel manual
     
  5. Sasha7b9

    Sasha7b9 New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2010
    Сообщения:
    105
    artkarЛюбезный, ну что ж вы водичку льёте. Уж код проверки тогда в студию.
    ИМХО.
     
  6. artkar

    artkar New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2005
    Сообщения:
    400
    Адрес:
    Russia
    mov eax, 1
    cpuid
    test edx , 01h
    jnz fpu_exist
     
  7. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    artkar+wiki=
    Код (Text):
    1. .686
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5.     include \masm32\include\windows.inc
    6.     include \masm32\include\kernel32.inc
    7.     include \masm32\include\masm32.inc
    8.  
    9.     includelib  \masm32\lib\kernel32.lib
    10.     includelib  \masm32\lib\masm32.lib
    11.  
    12. .data
    13.     _no_cpuid       db 'no_cpuid',0
    14.     _fpu_exist  db 'fpu_exist',0
    15.     _fpu_NOexist    db 'fpu_NOexist',0
    16. .code
    17. start:
    18.     pushfd      ; размещение регистра EFLAGS в стеке
    19.     pop eax ; извлечение значения EFLAGS в EAX
    20.     mov ebx, eax    ; сохранение значения в EBX
    21.     xor eax, 200000h    ; изменение 21-го бита
    22.     push    eax ; размещение нового значения в стеке
    23.     popfd       ; сохранение нового значения в EFLAGS
    24.     pushfd      ; снова размещение EFLAGS в стеке
    25.     pop eax ; значение EFLAGS теперь в EAX
    26.     xor eax, ebx    ; проверка 21-го бита
    27.     je  no_cpuid    ; если он не изменился, то CPUID не поддерживается
    28.  
    29.     mov eax, 1
    30.     cpuid
    31.     test    edx , 01h
    32.     jnz fpu_exist
    33.  
    34.     invoke  StdOut, addr _fpu_NOexist
    35.     ret
    36. no_cpuid:   invoke  StdOut, addr _no_cpuid
    37.     ret
    38. fpu_exist:invoke    StdOut, addr _fpu_exist
    39.     ret
    40. end start
    http://ru.wikipedia.org/wiki/Cpuid
     
  8. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    И что?
    На i386 и i486 CPUID нету, а FPU может быть.
    Как проверять?
    Отмазки типа это старые процессоры не принимаются, т.к. с таким подходом можно вообще ничего не проверять - у современных у всех FPU есть.
     
  9. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.729
    Не вижу смысла ибо начиная с 486 DX на всех процах есть FPU.

    Т.е. более 20 лет. Нынче проблематично найти такое старье даже при большом желании они уже и физически деградировали (в основном мамки с электролитами).

    На этом старье даже win 95 будет тормозить ....
     
  10. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    abcd008
    А может i286/i386 всё же знал опкоды команд fninit и fnstsw. Ведь как то мог этот процессор работать с FP сопроцессором.
    Может SII что нибудь скажет.
     
  11. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    SII может и скажет, если тему заметит)
     
  12. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Попробую прикрепить древний мануал - там по разным главам размазано много чего про особенности взаимодействия 286-386-486 с FPU, но прямого ответа на ваш вопрос я там не нашёл.
    Увы архив на 370кБ не прикрепился...
     
  13. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    Если меня не подводит память, то в IBM XT была 2-х байтная ячейка по адресу 0000:0410. Если выставлен второй бит - есть сопроцессор. В IBM AT уже появился вроде как CMOS, и поэтому можно было читать из CMOS с помощью 70 и 71 порта. Сначала нужно записать в 70-й порт 14, затем прочитать из 71 значение, например в AX, и потом and ax,2 - если установлен, есть сопроцессор. Примерно так вроде было это все.
     
  14. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    Сотбственно все то же самое возвращает int 11h в ax
     
  15. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Это уже результаты опроса процессора. Автора интересует, как это сделать напрямую через процессор.
     
  16. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Дело в том, что уметь выполнять вычисления над числами с плавающей запятой и уметь выполнять первичное декодирование соответствующих инструкций - это разные вещи. Процессор всегда умел выполнять первичное декодирование. А наличие встроенного FPU можно проверить по битику регистра CR0.
     
  17. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    -Процессор всегда умел выполнять первичное декодирование
    только это и интересавало) а в cr0 можно и поменять бит)
     
  18. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Я внес пояснения по поводу твоего недоумения, как процессор проглатывает инструкции сопроцессора. А логический вывод о том, что нужно отключить генерацию прерываний/исключений сопроцессора и проверить результат (или отсутствие результата) его работы, думал, что сделаешь сам. Что касается изменения битика в регистре CR0, то с удовольствием посмотрю на твои попытки это сделать, особенно учитывая тот факт, что он жестко фиксирован.
     
  19. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    если ты про EM и MP. то они меняются.
    покрайне мере на старых компах, для которых и нужна эта проверка, а не просто посмотреть наличие fpu в cpuid
     
  20. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Я про не помню как называется, но точно не про EM и MP - эти биты нужны для других целей.