|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
01.02.2011, 20:34 | #1 |
Пользователь
Регистрация: 23.11.2010
Сообщений: 12
|
invoke = push+call \ ddinvoke = ?+push+call
Здравствуйте. Подскажите пожалуйста возможна ли замена директивы ассемблера MASM32 "ddinvoke" на последовательность дискретных команд? Например как invoke можно заменить на серию push'ев+call.
Если вдруг кто подзабыл, ddinvoke - директива ассемблера для вызова (виртуальной?) функции DirectDraw. |
02.02.2011, 08:51 | #2 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
blinkapec
А в чем проблема? Компилируешь и линкуешь программу с директивой ddinvoke, затем пропускаешь ее через дизассемблер и смотришь чему эта директива соответствует... |
02.02.2011, 14:08 | #3 |
Пользователь
Регистрация: 23.11.2010
Сообщений: 12
|
Просто она у меня не компилировалась, программа с этой директивой. Короче решил я найти что-то подобное в другом ассемблере. Нашёл и сразу отпало много вопросов, но не все. Во-первых это видимо и не директива вовсе, а макрос, и не компилировался он из-за отсутствия*.inc-файла с его описанием. Во-вторых в примере, в котором я нашёл этот макрос видимо была опечатка, правильно похоже "dd4invoke", но не суть важно. В-третих фызываемая спомощью этого макроса функция похоже никакая не виртуальная, а очень даже реальная, видимо я не так что-то где-то понял . Теперь про дугой компилятор. В FASM есть подобный макрос - "cominvk". С ним у меня всё получилось скомпилировать и в отладчике я увидел что это всё те же push'ы+call, а вся возня с использованием макроса для вызова функции заключается в поиске адреса этой функции. Собственно приехали. Теперь остался такой вопрос - как правильно найти адрес нужной функции в DirectDraw? Хотя скорее какой-то указатель на неё... Уж извините, не понимаю пока полной картины. Я так понимаю мне неплохо бы почитать про com-объекты... Может быть подскажете как же всё таки "нативно" вызвать нужную функцию из DirectDraw? На каком-то примере может...
|
02.02.2011, 14:21 | #5 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
там вообще то помимо push/call есть еще пара mov для получения этого адреса, которых хранится в VMT
если не ошибаюсь, то идет примерно так. Код:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 02.02.2011 в 14:31. |
02.02.2011, 14:31 | #6 | |
Пользователь
Регистрация: 23.11.2010
Сообщений: 12
|
Цитата:
Всем ответившим спасибо огромное за помощь, буду изучать дальше. |
|
03.02.2011, 01:27 | #7 |
Пользователь
Регистрация: 23.11.2010
Сообщений: 12
|
Брр... ну типа доизучался. Только вопросы сменили друг друга =) Короче терь вот что интересно: сама таблица функций я так понимаю загружается с загрузкой PE-файла? Или может при создании копии объекта? А сами вызываемые функции берутся из ddraw.dll, так?
|
03.02.2011, 01:52 | #8 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
VMT скорее всего сформирована статически.
а вот обьект уже динамически, ну и соответственно указатель на VMT записывается в объект при его создании. Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Реализация метода Push для динамического класса | Mixim | Общие вопросы .NET | 1 | 21.11.2010 11:12 |
OpenGL, Push и Pop matrix | Krechet | Мультимедиа в Delphi | 5 | 21.02.2010 11:32 |
Ajax Push Engine и php | AndreyS | PHP | 0 | 04.07.2009 16:19 |
DLL!!!Как узнать что PUSH-ит!!! | Kuznecov | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 3 | 10.02.2009 22:04 |