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

Вниз

Выполнение функции   Найти похожие ветки 

 
Zorrow   (2003-11-20 09:55) [0]

Всем здрасти.

Вопрос к знатокам ASM-а в дельфи и не только:

Чтобы понятен был вопрос сразу объясню на примере:
можно легко вызвать ф-ю MessageBoxA(hwnd, Title, Cption, mb_OK)вот таким образом:

function MyMesageBox(hwnd, Title, Cption, mb_OK):Integer;
begin
result:=MessageBoxA(hwnd, Title, Cption, mb_OK);
end;

а как это сделать в общем случае, зная общий размер передаваемых параметров, что-то типа:

function MyMesageBox(hwnd, Title, Cption, mb_OK):Integer;
begin
asm
...
call MessageBoxA;
...
end;
end;

Конечно, мой вопрос может показаться странным и, возможно, неуместным, но на другие форумы не так часто заглядывают мастера, как здесь.


 
MBo ©   (2003-11-20 10:04) [1]

Нужно вначале положить в стек параметры в порядке, определенном соглашением о вызове (в данном случае stdcall)

пример вызова GetNearestPaletteIndex есть в
http://www.delphimaster.ru/articles/pixels/index.html


 
Zorrow   (2003-11-20 10:24) [2]

Ага спасиб


 
Zorrow   (2003-11-20 11:54) [3]

а возможно ли изнутри процедуры узнать ощий размер и количество передаваемых переменных?
пока что делаю так

function MyProc(P1:dword; P2:char):DWORD; stdcall;
begin
ShowMessage("Hello Params: "+Inttostr(P1)+" "+P2);
result:=123;
end;

function Proc(P1:dword; P2:char):DWORD; stdcall;
begin
asm
push P2
push P1
call myproc
end
end;

а необходимо
function Proc(P1:dword; P2:char):DWORD; stdcall;
var
Sz:DWORD;
begin
Sz:=GetProcStackSize;//<<========
asm
[в цикле 1 ..Sz] do
Push ?//<=====
call myproc
end
end;

возможно ли это сделать, просто в асме я полный профан


 
Digitman ©   (2003-11-20 12:11) [4]


> просто в асме я полный профан


а зачем полез тогда в эти дебри ? чем это обосновано ?


> а необходимо


при вызове некоей ф-ции ты обязан знать, какие и сколько параметров она ожидает
никаких иных критериев определения этого нет и быть не может


 
Digitman ©   (2003-11-20 12:16) [5]

исключением является только частный случай вызова методов интерфейса OLE-сервера автоматизации, но это - крайне непростой механизм и отдельный разговор, имеющий лишь общее сходство с вызовом статических ф-ций


 
Zorrow   (2003-11-20 12:26) [6]

>Digitman
а зачем полез тогда в эти дебри ? чем это обосновано ?
Слишком долго объяснять

при вызове некоей ф-ции ты обязан знать, какие и сколько параметров она ожидает

для того и существуют мозги, чтобы искать лучшие методы и решения - в данном случае в программном коде

никаких иных критериев определения этого нет и быть не может

Критерии, к твоему сведению есть - хотя бы анализ состояния регистров.


 
Digitman ©   (2003-11-20 12:59) [7]


> Zorrow


> Слишком долго объяснять


ну-ну) ... видать, великий секрет)


> для того и существуют мозги, чтобы искать лучшие методы
> и решения - в данном случае в программном коде


ситуация как в том анекдоте про мужика, ищущего ключи под фонарным столбом, когда потерял их в другом месте


> Критерии, к твоему сведению есть - хотя бы анализ состояния
> регистров.


в ран-тайм - бесцельное и бесполезное занятие

этим занимаются , когда есть листинг дизассемблирования конкретного кода и стоит задача вызова КОНКРЕТНОЙ ф-ции, а не произвольной, и прототипа интересующей ф-ции нет. Т.е. целью анализа является воссоздание прототипа.

кр.того, причем здесь регистры, если речь ты ведешь искл-но об stdcall ?

это - раз.

второе.
коль речь идет об stdcall, то единственное видимое решение - найти в теле (?) вызываемой ф-ции маш.код, соотв-щий инструкции RET N, но это чрезвычайно сложно и далеко не всегда даст ожидаемый рез-т


 
Digitman ©   (2003-11-20 13:03) [8]

Удалено модератором
Примечание: Offtopic


 
Zorrow   (2003-11-20 13:13) [9]

Удалено модератором
Примечание: Offtopic


 
Digitman ©   (2003-11-20 13:17) [10]

Удалено модератором
Примечание: Offtopic



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

Текущий архив: 2004.01.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
1-72761
_новый_
2004-01-14 11:58
2004.01.23
как скрыть панель запущенной программы которая находиться внизу в


6-72851
Yakudza
2003-11-20 16:42
2004.01.23
SMTP


14-72875
lena19
2004-01-01 23:48
2004.01.23
нужна прога для смены битрейта в MP3 на более низкий


3-72670
Vic
2003-12-25 17:26
2004.01.23
Окно отображающее процесс


1-72808
calmterror
2004-01-12 17:21
2004.01.23
Создание StringGrid в runtime