2011-08-25 2 views
5

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

Функциональный цилиндр (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

Перед тем, как получить слишком глубоко, пожалуйста, рассмотрите возможность использования SSE2 математику вместо x87. С гораздо проще работать (вы можете использовать регистры вместо стека), имеет больше доступных функций и, как правило, быстрее. – duskwuff

+0

Что сказал duskwuff. 'x87' эффективно устаревает, и очень мало оснований для того, чтобы новое программное обеспечение предназначалось для него. –

+0

@ Stephen - «устарел» от некоторой ОС, а не от процессора, поставщиков (но даже там, все еще поддерживается). Причины использования: например, 80-битная расширенная точность и трансцендентные математические функции. – PhiS

ответ

5

Сравнение с плавающей точкой - это своего рода боль. Вы можете выполнить сравнение на FPU, но прежде чем вы сможете что-либо сделать на основе этого, вам нужно передать слово состояния с плавающей точкой в ​​CPU, проверить флаги, которые вам нужны, а затем отреагировать на это.

Просто, например, ваше первоначальное сравнение, что г> = 0,0 будет выглядеть примерно так:

fldz 
fcomp z 
fnstsw ax 
test ah, 041h; I *think* I've got the right flags there... 
jp good 
+4

Хм, разве это не будет «тест ах ...»? [Ссылка] (http://webster.cs.ucr.edu/AoA/Windows/HTML/RealArithmetic.html#1000117). Лично я считаю, что использовать ['FCOMI'] (http://stackoverflow.com/questions/7057501/x86-assembler-floating-point-compare/7057771#7057771) проще, чем использовать битмаски для слова состояния, он доступен только на P6 +. – user786653

+3

@ user786653: oops - да, это должно быть ах, а не топор. Мои извинения.Да, FCOMI хорош, но к тому моменту, когда появился P6, я не писал почти столько же кода сборки. Если бы я писал для новых процессоров, я бы, вероятно, использовал SSE. –

+2

Согласен, если я * имел *, чтобы записать его в ассемблере x86. Похоже, что OP установлен на использовании x87, хотя, поэтому я решил, что я его пропустил. Я также смутно вспоминаю тесты 'sahf' + unsigned (как с' fcomi'). – user786653

 Смежные вопросы

  • Нет связанных вопросов^_^