Форум: "Потрепаться";
Текущий архив: 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