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

Вниз

Как у 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.026 c
14-96357
Dimka Maslov
2003-09-12 12:17
2003.09.29
English


6-96317
И. Вадим
2003-07-30 19:21
2003.09.29
TWebbrowser


1-96269
Niobe
2003-09-17 11:06
2003.09.29
Про Hint


3-96063
Step[B.M.]
2003-09-07 09:40
2003.09.29
Какие ограничения у нелицензированой IBPlus?


4-96494
Sania
2003-07-28 21:07
2003.09.29
Использование функций WinAPI