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

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

  1. abcd008

    abcd008 New Member

    Blog Posts:
    0
    Я понимаю что 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
    под ошибкой понимается- неизвестная команда.
     
  3. artkar

    artkar New Member

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

    Имхо
     
  4. abcd008

    abcd008 New Member

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

    Sasha7b9 New Member

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

    artkar New Member

    Blog Posts:
    0
    mov eax, 1
    cpuid
    test edx , 01h
    jnz fpu_exist
     
  7. _sheva740

    _sheva740 New Member

    Blog Posts:
    0
    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
    И что?
    На i386 и i486 CPUID нету, а FPU может быть.
    Как проверять?
    Отмазки типа это старые процессоры не принимаются, т.к. с таким подходом можно вообще ничего не проверять - у современных у всех FPU есть.
     
  9. asmlamo

    asmlamo Well-Known Member

    Blog Posts:
    0
    Не вижу смысла ибо начиная с 486 DX на всех процах есть FPU.

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

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

    T800 Member

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

    abcd008 New Member

    Blog Posts:
    0
    SII может и скажет, если тему заметит)
     
  12. Y_Mur

    Y_Mur Active Member

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

    Tronix Member

    Blog Posts:
    0
    Если меня не подводит память, то в 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
    Сотбственно все то же самое возвращает int 11h в ax
     
  15. Phantom_84

    Phantom_84 New Member

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

    Phantom_84 New Member

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

    abcd008 New Member

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

    Phantom_84 New Member

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

    abcd008 New Member

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

    Phantom_84 New Member

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