Инструкции x87 FPOP и FCOM - как они работают?

Мне было поручено написать простое приложение на смешанном C / ASM, которое должно использовать математический сопроцессор.

Есть функция цилиндр (float x, float y, float z), которая возвращает 1, если данная точка находится внутри цилиндра (цилиндр имеет основание в x = 0, y = 0, радиус = 5 и высоту = 10. ) и 0, если это не так.

Итак, выглядит просто. Проверьте, находится ли z в пределах <0,10>, а затем проверьте, если x ^ 2 + y ^ 2 <25.

Но мои знания о x87 равны нулю.

Это все, что я написал.

_cylinder PROC

push ebp
mov ebp, esp
sub esp,8 ; I can't use .data in the application, so I reserve some space on the stack for numbers 10 and 25
mov [esp],10
mov [esp+4],25

finit
fldz
fld [ebp+8]

    ;here i get stuck 

add esp, 8
pop ebp
_cylinder ENDP

Итак, я застрял. Итак, я пытаюсь найти, какие инструкции можно использовать в приложении. И здесь я застреваю, потому что каждый список руководств / инструкций, который я нахожу в сети, написан так плохо, что я почти ничего не могу понять.

Вопрос в том, что происходит, когда я извлекаю что-то из математического сопроцессора? Где я могу найти всплывающее значение? Как он конвертирует из 80-битного значения в 32-битное (если, конечно) Другой вопрос, как работает FCOM (FCOMP для популярного варианта)? Он сравнивает что с чем (st0 с st1 или st1 с st0?), И где я могу увидеть, меньше ли / равно / больше значение?

Спасибо за любую помощь!

5
задан Kara 15 January 2014 в 16:50
поделиться