Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2009, 20:06   #1
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию работа с FPU

в общем у меня задача проверить явл ли точки a b c вершинами правильного треугольника. Вопрос состоит вот в чем. Я посчитал то что мне надо, а конкретно dist(a,b) - dist(b,c) и dist(a,b) - dist(a,c) . Сохранил их в st(0) и st(1). Далее буду говорить что st(0) = A-B , st(1) = A-C

дальше мне надо найти модуль этих выражений, я загружаю на стек переменную в которой хранится 0 для следующего сравнения

tmp: .double 0.0
...
fld qword ptr tmp

но оказалось что стек переполнен и я не могу загрузить 0. Остальные регистры мне теперь не нужны я с ними уже прооперировал как мне было надо. Как можно освободить стек. И где после выталкивания со стека будут хранится A-B и A-C. Знаю, что есть такая команда fstp , но как её использовать правильно не понял.

Последний раз редактировалось NiCola999; 03.11.2009 в 20:09.
NiCola999 вне форума Ответить с цитированием
Старый 03.11.2009, 21:01   #2
Виталий Серов
Заснувший
Форумчанин
 
Регистрация: 13.03.2009
Сообщений: 213
По умолчанию

Цитата:
Знаю, что есть такая команда fstp , но как её использовать правильно не понял.
Код:
fstp tword [ebx] ; store value in memory and pop stack
Обяснение взял из книжки FASM. При использывании этой команды стек(FPU) подвинется в сторону уменьшения, т.е.
ДО ПОСЛЕ
st0 = st1
st1 = st2
st2 = st3
.....
st7 = st0
В вашем случае st(7) = A-B , st(0) = A-C

Не совсем понятно выражение
Цитата:
но оказалось что стек переполнен и я не могу загрузить 0
Стек ФПУ не может быть переполнен, при загрузке нового значения стек просто двигается в сторону увеличения.
А для загрузки нуля в ФПУ существует команда fldz.
Виталий Серов вне форума Ответить с цитированием
Старый 03.11.2009, 21:03   #3
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

fstp param , где param это переменная.

Ктоме того, но это уже скорее оптимизация, существует команда fldz для загрузки нуля.
А еще существует команда fabs для получения модуля.

Цитата:
Стек ФПУ не может быть переполнен, при загрузке нового значения стек просто двигается в сторону увеличения.
Вообще-то может. Если загрузить в него больше 8 значений, то возникает такая неприятная ситуация.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 03.11.2009 в 21:06.
Goodwin98 вне форума Ответить с цитированием
Старый 03.11.2009, 21:22   #4
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

спасибо ! я и не знал что есть fabs и fldz

стек может быть переполнен. Вот как мне поступить в моем случае
допустим я сделаю так
fstp st(1)
то есть st(1) вытолкнется со стека а его значение станет значение st(0)

или нет?
где будут тогда A-B и A-C

Последний раз редактировалось NiCola999; 03.11.2009 в 21:27.
NiCola999 вне форума Ответить с цитированием
Старый 03.11.2009, 21:31   #5
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Цитата:
спасибо ! я и не знал что есть fabs и fldz
Вот здесь кроме прочего есть команды FPU. Советую поизучать
Команда fstp сохраняет только верхнее значение со стека, т.е. ST(0), остальные при этом сдвигаются, т.е. st(1) становиться st(0), st(2) -> st(1) и т.п. Если будет понятней, это команда обратная fld.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 03.11.2009, 22:08   #6
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

спасибо.A если я делаю 2 раза сравнение и флаг устанавливаются после первого сравнения, нужно его обнулять или сравнение само всё делает

если надо обнулять то какая команда обнуляет CF , clc ?

Последний раз редактировалось NiCola999; 03.11.2009 в 22:10.
NiCola999 вне форума Ответить с цитированием
Старый 03.11.2009, 22:27   #7
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Команды сравнения изменяют флаги в любом случае.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 03.11.2009, 22:36   #8
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

в общем мне надо сделать такое сравнение
eps = 0.001

if (abs(A-B)<eps && abs(A-C) <eps)
return 1;
else
return 0;

вот что у меня получилось ....

st(5) = abs(A-B)
st(6) = abs(A-C)

Код:

            fld qword ptr eps
            fcom st(6)
            jb next         # если меньше
            #иначе
            fcom st(7) 
            jnb return0
next:
            fcom st(7)
            jb return1

return1:
            mov eax,1
            ret

return0:
            mov eax,0
            ret
правильно или нет ?

поправка... я загрузил eps значит стек сдвинулся опять

и еще вопрос... приведите пример точек которые будуи вершинами прав треуг.
проверяю на этих
0 0
2,5 4
5 0

выводит 0...

еще на этих

0 0
5 8
10 0

выводит 1

Последний раз редактировалось NiCola999; 03.11.2009 в 22:52.
NiCola999 вне форума Ответить с цитированием
Старый 03.11.2009, 22:46   #9
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

зачем тут нужно это?
Код:
            fcomi st(6)
            jb return1

return1:
PS: а еще есть команда setb al ...
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 03.11.2009, 23:03   #10
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

если оба меньше eps вернуть 1

на каких точках можно точно проверить ?
NiCola999 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача. Работа с псевдослучайными последовательностями (ПСП). Работа с цветом. 0101 Помощь студентам 3 17.12.2009 23:57
Работа с webbrowser - Фреймы, работа с конкретным феймом в фрейме NewDelphi Фриланс 2 08.10.2009 11:00