Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

или я не прав или как [D6, Win95/98, WinME, Win2k]


Дурак2 ©   (2002-12-26 07:33:00) 

Юзаю такую функцию - предаю Х получаю Х, а почему?
.486
.487
.MODEL LARGE,PASCAL
CODESEG
PUBLIC SASM
SASM PROC near X:TBYTE
FLD X
F2xm1
FFREE
RET
ENDP SASM
END


Дурак2   (2002-12-27 05:25:00) [1]

Да реализация меня не волновала - я инструкции проверял.
Меня интересовало почему в Паскале не было возведения в степень, - сейчас Power используется, но меня интресовала другая реализация - для интереса. Раньше надо было использовать Exp Log - натолкнулся, что сопроцессор держит такую инструкцию(F2XM1) и еще логарифмирование - вот и захотел сделать возведение на уровне сопроцессора, и обломался - инструкция не работала. Ясно что что-то было не так - уж больно глупо - отсюда и Ник такой. Но у меня 3 справочника по инструкциям - везде написано ЧТОэта инструкция делает, но нигдене было ни слова про диапазон [-1,1].
Насчет хамства - извиняюсь.


Дурак2   (2002-12-26 12:06:00) [2]


>Кстати, для генерации маски эт дело не пойдет, ибо операндом >F2XM1 м.б. занчение в диапазоне [ -1.0 ... +1.0 ], в противном >случае результат неопределен
А это интересно - не видел.


Anatoly Podgoretsky   (2002-12-26 12:06:00) [3]

Воспользуйся советом про встроенный ассемблер, нет нужды использовать внешний, тебе же проще и с отладкой тоже.
Саму реализацию не затрагиваю, это другое.


Digitman   (2002-12-26 12:04:00) [4]


> а ты 3 заюзай и получи что надо а потом выкабенивайся.


Не хами ! Глаза и голова на плечах у программера для того, чтобы - в 1-ю очередь ! - читать документацию и вникать в нее.
Бери мануал от Intel по маш.инструкциям и вчитывайся в него !
И я тебе уже процитировал оттуда (из мануала), что


> операндом F2XM1 м.б. занчение в диапазоне [ -1.0 ... +1.0
> ], в противном случае результат неопределен


Ты въехал в это ? Ну так а какого ж ты тройку туда тычешь ?


Дурак2   (2002-12-26 11:50:00) [5]

Ну вот - содрал.
Ничего не сдирал - сам писал.
про FFREE - погорячился.
я с этим долго бодался - и последнее кинул - бывает.
посто когда я синусы считаю или еще чего - все нормально, а вот эта инструкция не пашет, хоть убей.
при a=1 f(x)=1 - сам видел, а ты 3 заюзай и получи что надо а потом выкабенивайся.


Digitman   (2002-12-26 10:58:00) [6]


> icWasya


Во встр. ассемблере Делфи верно будет так :

function sasm(x:extended):extended;
asm
FLD X // обязательно при декларации function sasm(x:extended):extended;external;

F2xm1
end;


> в данном случае рараметр процедуры передаётся через верхушку
> стека сопроцессора


ничего подобного.
через верхушку стека CPU - да, но не FPU

при регистровом соглашении OP лишь автоматом снимет с верхушки стека FPU результат (т.е. самостоятельно вставит FSTP в код сразу же за возвратом из sasm() по RET)


> Anatoly Podgoretsky


Точно) ... Наверно, так и было - "содрал" откуда-то))
Кстати, для генерации маски эт дело не пойдет, ибо операндом F2XM1 м.б. занчение в диапазоне [ -1.0 ... +1.0 ], в противном случае результат неопределен

Ну а при a = 1, разумеется, результат sasm(a) будет 1

2 ^ 1 - 1 = 1

))


Anatoly Podgoretsky   (2002-12-26 10:31:00) [7]

Digitman © (26.12.02 09:58)
Остальное мне неясно, так как необходимость использовать TASM, Дельфи с этим сама нормально справляется, думаю просто взял откуда то этот кусок.


icWasya   (2002-12-26 10:12:00) [8]

по умолчанию соглашение о вызовах процедур в дельфи - Register.
то есть в данном случае рараметр процедуры передаётся через верхушку стека сопроцессора.

что при этом делает такой код

в верхушке стека лежит параметр A
SASM PROC near X:TBYTE
FLD X грузим в верхушку стека ещё чтото
F2xm1 это чтото обрабатываем
FFREE результат вычёркиваем
в стеке остаётся A
RET - что и получаем на выходе

--------------
для правильной работы команды FLD и FFREE надо выкинуть


Digitman   (2002-12-26 09:59:00) [9]

Хотя ... ничего удивительного - НИК тому соответствует оч даже)))


Digitman   (2002-12-26 09:58:00) [10]


> Anatoly Podgoretsky


Ок. Спасибо. Я просто не в курсе. Ten - значит Ten.
Остается невыясненным, зачем автору двойку возводить в возможно нецелую степень и вычитать единицу. Если это нужно для генерации битовой маски шириной X с единицами во всех разрядах, то параметр/результат д.б. целочисленным. И FP-инструкции, соответственно - FILD/FISTP


Anatoly Podgoretsky   (2002-12-26 09:43:00) [11]

Digitman © (26.12.02 09:28)
1. Почему X: TBYTE ? Ты же extended передаешь и получаешь !

Это и будет extended - Ten BYTEs (80 bits)


Digitman   (2002-12-26 09:28:00) [12]

1. Почему X: TBYTE ? Ты же extended передаешь и получаешь !

2. Зачем FFREE делаешь ? Ты ж результат на вершине стека очищаешь !

3. Кто за тебя FST X будет делать ? Выгрузка результата отсутствует !

FLD X - загрузка st(0) аргументом, стек вырос на один PUSH
F2XM1 - операция на вершине стека st(i) <- 2 ^ st(i) - 1
FSTP X - выгрузка st(0) + балансировка стека (авто-POP)


Дурак2   (2002-12-26 07:37:00) [13]

Юзаю так
program sinus;
uses sysutils;
function sasm(x:extended):extended;external;
{$L asmsin.obj}
var a,b : extended;
begin
a := 1;
b := sasm(a)
end.


Наверх

Титульная страница Поиск, карта сайта Написать письмо