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

Discussion in 'WASM.OS.DEVEL' started by abcd008, Feb 7, 2011.

  1. abcd008

    abcd008 New Member

    Blog Posts:
    0
    Joined:
    Feb 8, 2009
    Messages:
    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

    Blog Posts:
    0
    Joined:
    Feb 8, 2009
    Messages:
    616
    под ошибкой понимается- неизвестная команда.
     
  3. artkar

    artkar New Member

    Blog Posts:
    0
    Joined:
    Aug 17, 2005
    Messages:
    400
    Location:
    Russia
    По уму перед тем как его юзать нужно проверить его наличие, если код без проверки начинает юзать сопроцессор, то видимо это просчёт автора.

    Имхо
     
  4. abcd008

    abcd008 New Member

    Blog Posts:
    0
    Joined:
    Feb 8, 2009
    Messages:
    616
    я про это и говорю, но такой же код используется в intel manual
     
  5. Sasha7b9

    Sasha7b9 New Member

    Blog Posts:
    0
    Joined:
    Oct 17, 2010
    Messages:
    105
    artkarЛюбезный, ну что ж вы водичку льёте. Уж код проверки тогда в студию.
    ИМХО.
     
  6. artkar

    artkar New Member

    Blog Posts:
    0
    Joined:
    Aug 17, 2005
    Messages:
    400
    Location:
    Russia
    mov eax, 1
    cpuid
    test edx , 01h
    jnz fpu_exist
     
  7. _sheva740

    _sheva740 New Member

    Blog Posts:
    0
    Joined:
    Aug 31, 2005
    Messages:
    1,539
    Location:
    Poland
    artkar+wiki=
    Code (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

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

    asmlamo Well-Known Member

    Blog Posts:
    0
    Joined:
    May 18, 2004
    Messages:
    1,742
    Не вижу смысла ибо начиная с 486 DX на всех процах есть FPU.

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

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

    T800 Member

    Blog Posts:
    0
    Joined:
    Dec 7, 2006
    Messages:
    293
    Location:
    Moscow
    abcd008
    А может i286/i386 всё же знал опкоды команд fninit и fnstsw. Ведь как то мог этот процессор работать с FP сопроцессором.
    Может SII что нибудь скажет.
     
  11. abcd008

    abcd008 New Member

    Blog Posts:
    0
    Joined:
    Feb 8, 2009
    Messages:
    616
    SII может и скажет, если тему заметит)
     
  12. Y_Mur

    Y_Mur Active Member

    Blog Posts:
    0
    Joined:
    Sep 6, 2006
    Messages:
    2,494
    Попробую прикрепить древний мануал - там по разным главам размазано много чего про особенности взаимодействия 286-386-486 с FPU, но прямого ответа на ваш вопрос я там не нашёл.
    Увы архив на 370кБ не прикрепился...
     
  13. Tronix

    Tronix Member

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

    Tronix Member

    Blog Posts:
    0
    Joined:
    Sep 10, 2010
    Messages:
    122
    Сотбственно все то же самое возвращает int 11h в ax
     
  15. Phantom_84

    Phantom_84 New Member

    Blog Posts:
    0
    Joined:
    Jun 6, 2007
    Messages:
    820
    Это уже результаты опроса процессора. Автора интересует, как это сделать напрямую через процессор.
     
  16. Phantom_84

    Phantom_84 New Member

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

    abcd008 New Member

    Blog Posts:
    0
    Joined:
    Feb 8, 2009
    Messages:
    616
    -Процессор всегда умел выполнять первичное декодирование
    только это и интересавало) а в cr0 можно и поменять бит)
     
  18. Phantom_84

    Phantom_84 New Member

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

    abcd008 New Member

    Blog Posts:
    0
    Joined:
    Feb 8, 2009
    Messages:
    616
    если ты про EM и MP. то они меняются.
    покрайне мере на старых компах, для которых и нужна эта проверка, а не просто посмотреть наличие fpu в cpuid
     
  20. Phantom_84

    Phantom_84 New Member

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