Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.09.29;
Скачать: [xml.tar.bz2];

Вниз

Как у FreePascal-я передаются параметры функции?   Найти похожие ветки 

 
cyborg   (2003-09-11 17:57) [0]

Не пойму никак, передаю два указателя:

Function Func(P1,P2 : Pointer) assembler;

, в Дельфи первый в EDX, второй в EAX вроде или наоборот, а тут первый в EAX а второй неизвестно куда.

Как его получить?


 
MBo   (2003-09-11 18:07) [1]

в стеке, наверно.


 
cyborg   (2003-09-11 18:12) [2]

Делаю Pop EAX; там не то, если так нужно :)


 
PVOzerski   (2003-09-11 18:14) [3]

По умолчанию - как в STDCALL, только без сохранения некоторых регистров - т.е. через стек "справа налево", с очисткой стека из вызванной функции. Рекомендую сгенерить ASM-код из FPC (ключи -s -a) и посмотреть самому.


 
PVOzerski   (2003-09-11 18:16) [4]

>Делаю Pop EAX; там не то, если так нужно :)
А режим ассемблера какой выставлен? По умолчанию у него синтаксис AT&T, тогда надо писать
asm
popl %EAX
end;
или же включить {$asmmode Intel}, но я этому режиму не доверяю: глюки бывали.


 
cyborg   (2003-09-11 18:27) [5]

Режим Intel поставил.

На четвёртом pop EAX оказывается нужное значение

Function CollisionMMX(Rect1,Rect2 : Pointer) : LongBool; assembler;
asm
movq mm1,[eax]; //Rect1 X1Y1
movq mm2,[eax+$08]; //Rect1 X2Y2
pop eax;
pop eax;
pop eax;
pop eax;
- тут нужное значение
movq mm3,[eax]; //Rect2 X1Y1

Можно сделать просто
mov eax,Rect2;
так работает, только скорость функции падает процентов на 40 где-то, хотя скорость зависит от объёма обрабатываемых данных.


 
Иван Шихалев   (2003-09-11 18:29) [6]


> На четвёртом pop EAX оказывается нужное значение


Логично, там же идет еще и служебное сохранение регистров.


 
MBo   (2003-09-11 18:30) [7]

в дельфи для stdcall параметры лежат так:
proc(a,b,c:integer);stdcall;

ebp + 16 третий
ebp + 12 второй 4 bytes
ebp + 08 первый параметр 4 bytes
ebp + 04 return address, 4 bytes
ebp + 00 old ebp value


 
PVOzerski   (2003-09-11 18:31) [8]

Ага, потому что через pop обычно переданные через стек параметры не добывают. И стек вы так испакостить можете, ведь потом-то компилятор вставит ret 4, не задумываясь о Ваших pop.


 
PVOzerski   (2003-09-11 18:32) [9]

Именно как у Мастера Бо ( [7] ) :^)


 
cyborg   (2003-09-11 19:00) [10]

Ладно, буду разбираться, в такой функции ebp+12 содержит нужное значение, в inline функции нет, там ещё листинг ассамблера в формате At&T вроде, мне его трудно понимать.


 
PVOzerski   (2003-09-11 21:47) [11]

С inline-функциями у FPC история особая, ноя ее сейчас и касаться не буду. Я не понимаю другого: почему нельзя обратиться к параметрам по именам? Оптимизатор у FPC не такой уж плохой, да еще и настраиваемый, так что суть-то будет одна и та же.


 
cyborg   (2003-09-11 21:56) [12]

Я уже разобрался, спасибо!
Дело в том что по имени в MMX регистрах почему-то не то получается, поэтому делал сначала mov EAX,Rect1; затем уже movq mm1,[EAX];
Когда делал movq mm1,[Rect1] почему-то мусор был.



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

Форум: "Потрепаться";
Текущий архив: 2003.09.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.009 c
3-96152
hawkins
2003-09-08 09:02
2003.09.29
опредклять все типы данных полей таблицы interbase?


4-96498
Yuri Btr
2003-07-28 21:10
2003.09.29
Смена принтера по умолчанию


6-96314
AHTOH
2003-07-30 00:26
2003.09.29
Как узнать, что порт, занятый моей прогой, нужен какой-то другой


7-96458
Prov
2003-07-17 14:39
2003.09.29
Размер экрана


1-96258
aldapooh
2003-09-17 13:33
2003.09.29
HTML Help





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский