Форум: "Основная";
Текущий архив: 2003.01.09;
Скачать: [xml.tar.bz2];
Внизили я не прав или как Найти похожие ветки
← →
Дурак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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c