Я понимаю что 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, как тогда не происходит ошибок при выполнении команд. ведь процессор их не знает?
По уму перед тем как его юзать нужно проверить его наличие, если код без проверки начинает юзать сопроцессор, то видимо это просчёт автора. Имхо
artkar+wiki= Code (Text): .686 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib .data _no_cpuid db 'no_cpuid',0 _fpu_exist db 'fpu_exist',0 _fpu_NOexist db 'fpu_NOexist',0 .code start: pushfd ; размещение регистра EFLAGS в стеке pop eax ; извлечение значения EFLAGS в EAX mov ebx, eax ; сохранение значения в EBX xor eax, 200000h ; изменение 21-го бита push eax ; размещение нового значения в стеке popfd ; сохранение нового значения в EFLAGS pushfd ; снова размещение EFLAGS в стеке pop eax ; значение EFLAGS теперь в EAX xor eax, ebx ; проверка 21-го бита je no_cpuid ; если он не изменился, то CPUID не поддерживается mov eax, 1 cpuid test edx , 01h jnz fpu_exist invoke StdOut, addr _fpu_NOexist ret no_cpuid: invoke StdOut, addr _no_cpuid ret fpu_exist:invoke StdOut, addr _fpu_exist ret end start http://ru.wikipedia.org/wiki/Cpuid
И что? На i386 и i486 CPUID нету, а FPU может быть. Как проверять? Отмазки типа это старые процессоры не принимаются, т.к. с таким подходом можно вообще ничего не проверять - у современных у всех FPU есть.
Не вижу смысла ибо начиная с 486 DX на всех процах есть FPU. Т.е. более 20 лет. Нынче проблематично найти такое старье даже при большом желании они уже и физически деградировали (в основном мамки с электролитами). На этом старье даже win 95 будет тормозить ....
abcd008 А может i286/i386 всё же знал опкоды команд fninit и fnstsw. Ведь как то мог этот процессор работать с FP сопроцессором. Может SII что нибудь скажет.
Попробую прикрепить древний мануал - там по разным главам размазано много чего про особенности взаимодействия 286-386-486 с FPU, но прямого ответа на ваш вопрос я там не нашёл. Увы архив на 370кБ не прикрепился...
Если меня не подводит память, то в IBM XT была 2-х байтная ячейка по адресу 0000:0410. Если выставлен второй бит - есть сопроцессор. В IBM AT уже появился вроде как CMOS, и поэтому можно было читать из CMOS с помощью 70 и 71 порта. Сначала нужно записать в 70-й порт 14, затем прочитать из 71 значение, например в AX, и потом and ax,2 - если установлен, есть сопроцессор. Примерно так вроде было это все.
Дело в том, что уметь выполнять вычисления над числами с плавающей запятой и уметь выполнять первичное декодирование соответствующих инструкций - это разные вещи. Процессор всегда умел выполнять первичное декодирование. А наличие встроенного FPU можно проверить по битику регистра CR0.
-Процессор всегда умел выполнять первичное декодирование только это и интересавало) а в cr0 можно и поменять бит)
Я внес пояснения по поводу твоего недоумения, как процессор проглатывает инструкции сопроцессора. А логический вывод о том, что нужно отключить генерацию прерываний/исключений сопроцессора и проверить результат (или отсутствие результата) его работы, думал, что сделаешь сам. Что касается изменения битика в регистре CR0, то с удовольствием посмотрю на твои попытки это сделать, особенно учитывая тот факт, что он жестко фиксирован.
если ты про EM и MP. то они меняются. покрайне мере на старых компах, для которых и нужна эта проверка, а не просто посмотреть наличие fpu в cpuid