Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-24948
Nimda
2002-12-26 16:58
2003.01.09
Canvas


7-25112
turonix
2002-10-27 21:41
2003.01.09
В чем ошибка?


3-24803
adolf_99
2002-12-16 18:55
2003.01.09
Помогите


6-24995
Kon2002
2002-11-07 19:13
2003.01.09
WinXP


4-25155
UNIVERSAL
2002-11-22 10:50
2003.01.09
Недвигающееся окно





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский