Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 01.02.2011, 21:34   #1
blinkapec
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 12
Репутация: 10
Вопрос invoke = push+call \ ddinvoke = ?+push+call

Здравствуйте. Подскажите пожалуйста возможна ли замена директивы ассемблера MASM32 "ddinvoke" на последовательность дискретных команд? Например как invoke можно заменить на серию push'ев+call.
Если вдруг кто подзабыл, ddinvoke - директива ассемблера для вызова (виртуальной?) функции DirectDraw.
blinkapec вне форума   Ответить с цитированием
Старый 02.02.2011, 09:51   #2
Mikl___
Профессионал
 
Регистрация: 11.01.2010
Сообщений: 1,128
Репутация: 926
По умолчанию

blinkapec
А в чем проблема? Компилируешь и линкуешь программу с директивой ddinvoke, затем пропускаешь ее через дизассемблер и смотришь чему эта директива соответствует...
Mikl___ вне форума   Ответить с цитированием
Старый 02.02.2011, 15:08   #3
blinkapec
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от Mikl___ Посмотреть сообщение
blinkapec
А в чем проблема? Компилируешь и линкуешь программу с директивой ddinvoke, затем пропускаешь ее через дизассемблер и смотришь чему эта директива соответствует...
Просто она у меня не компилировалась, программа с этой директивой. Короче решил я найти что-то подобное в другом ассемблере. Нашёл и сразу отпало много вопросов, но не все. Во-первых это видимо и не директива вовсе, а макрос, и не компилировался он из-за отсутствия*.inc-файла с его описанием. Во-вторых в примере, в котором я нашёл этот макрос видимо была опечатка, правильно похоже "dd4invoke", но не суть важно. В-третих фызываемая спомощью этого макроса функция похоже никакая не виртуальная, а очень даже реальная, видимо я не так что-то где-то понял . Теперь про дугой компилятор. В FASM есть подобный макрос - "cominvk". С ним у меня всё получилось скомпилировать и в отладчике я увидел что это всё те же push'ы+call, а вся возня с использованием макроса для вызова функции заключается в поиске адреса этой функции. Собственно приехали. Теперь остался такой вопрос - как правильно найти адрес нужной функции в DirectDraw? Хотя скорее какой-то указатель на неё... Уж извините, не понимаю пока полной картины. Я так понимаю мне неплохо бы почитать про com-объекты... Может быть подскажете как же всё таки "нативно" вызвать нужную функцию из DirectDraw? На каком-то примере может...
blinkapec вне форума   Ответить с цитированием
Старый 02.02.2011, 15:18   #4
veniside
Профессионал
 
Регистрация: 03.01.2011
Сообщений: 2,508
Репутация: 868
По умолчанию

Цитата:
Сообщение от blinkapec Посмотреть сообщение
Я так понимаю мне неплохо бы почитать про com-объекты...
Верно, ведь DirectDraw — это набор COM объектов, почитать можно тут.
__________________
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума   Ответить с цитированием
Старый 02.02.2011, 15:21   #5
Пепел Феникса
Модератор
Заслуженный модератор
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 20,997
Репутация: 3402

icq: 446843180
skype: phoenix_proger
По умолчанию

там вообще то помимо push/call есть еще пара mov для получения этого адреса, которых хранится в VMT
если не ошибаюсь, то идет примерно так.
Код:

mov eax,ecx;в ecx был адрес указателя на наш объект.
mov eax,[ecx];получаем адрес самого объекта
push eax;его передаем как параметр(передается всегда)
mov eax,[eax];берем адрес VMT
call [eax+4];ну и вызов функции номер два из VMT(это AddRef)

__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 02.02.2011 в 15:31.
Пепел Феникса вне форума   Ответить с цитированием
Старый 02.02.2011, 15:31   #6
blinkapec
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 12
Репутация: 10
Лампочка

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
там вообще то помимо push/call есть еще пара mov для получения этого адреса, которых хранится в VMT
Да-да, в макросе есть пара mov Просто я имел ввиду что вся суть макроса - получение адреса, а сам вызов осуществляется как обычно.

Всем ответившим спасибо огромное за помощь, буду изучать дальше.
blinkapec вне форума   Ответить с цитированием
Старый 03.02.2011, 02:27   #7
blinkapec
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 12
Репутация: 10
По умолчанию

Брр... ну типа доизучался. Только вопросы сменили друг друга =) Короче терь вот что интересно: сама таблица функций я так понимаю загружается с загрузкой PE-файла? Или может при создании копии объекта? А сами вызываемые функции берутся из ddraw.dll, так?
blinkapec вне форума   Ответить с цитированием
Старый 03.02.2011, 02:52   #8
Пепел Феникса
Модератор
Заслуженный модератор
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 20,997
Репутация: 3402

icq: 446843180
skype: phoenix_proger
По умолчанию

VMT скорее всего сформирована статически.
а вот обьект уже динамически, ну и соответственно указатель на VMT записывается в объект при его создании.
Цитата:
А сами вызываемые функции берутся из ddraw.dll, так?
ну да.
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализация метода Push для динамического класса Mixim Общие вопросы .NET 1 21.11.2010 12:12
OpenGL, Push и Pop matrix Krechet Мультимедиа в Delphi 5 21.02.2010 12:32
Ajax Push Engine и php AndreyS PHP 0 04.07.2009 16:19
DLL!!!Как узнать что PUSH-ит!!! Kuznecov Assembler 3 10.02.2009 23:04


16:14.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru