Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.09;
Скачать: CL | DM;

Вниз

или я не прав или как   Найти похожие ветки 

 
Дурак2   (2002-12-26 07:33) [0]

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


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

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


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

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)


 
Anatoly Podgoretsky ©   (2002-12-26 09:43) [3]

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

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


 
Digitman ©   (2002-12-26 09:58) [4]


> Anatoly Podgoretsky


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


 
Digitman ©   (2002-12-26 09:59) [5]

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


 
icWasya ©   (2002-12-26 10:12) [6]

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

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

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

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



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

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


 
Digitman ©   (2002-12-26 10:58) [8]


> 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

))


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

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


 
Digitman ©   (2002-12-26 12:04) [10]


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


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


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


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


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


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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2003.01.09;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
3-24814
Светлана
2002-12-17 09:29
2003.01.09
Помогите найти пример SQL скриптика с использованием курсоров ...


7-25104
Dima1
2002-10-30 06:49
2003.01.09
LPT порт, как с ним работать


14-25091
inc(665)
2002-12-22 13:16
2003.01.09
NY, how, where, with who? :)


1-24852
Dm9
2002-12-27 18:43
2003.01.09
Результат работы консольной программы


14-25011
Ketmar
2002-12-19 16:02
2003.01.09
обжалование действий при остутствии улик.