Здравствуйте, Misha87, Вы писали:
M>У меня есть указатель на функцию — метод класса, у меня есть указатель на объект. Как из ассемблерной сатвки вызвать этот метод?
Если это x86 и Виндовс, то скорее всего, вы вызываете метод обычной инструкцией call, а указатель на экземпляр объекта и затем список всех переменных передаёте через стек в обратном порядке, т.е. последний параметр кладётся в стек первым, это всё только для типа __stdcall. Если используется __fastcall, то указатель на экземпляр и первые 2 параметра передаются через eax, edx, ecx, соответственно. А, вообще, более универсальный способ вы можете подглядеть у компилятора, собрав исполняшку и оттрассировав её.
Некто сказал: Щисливага программинья ;-)
Re[2]: Как из ассемблерной вставки в С++ коде вызвать метод
Здравствуйте, Зануда, Вы писали:
З>Здравствуйте, Misha87, Вы писали:
M>>У меня есть указатель на функцию — метод класса, у меня есть указатель на объект. Как из ассемблерной сатвки вызвать этот метод?
З>Если это x86 и Виндовс, то скорее всего, вы вызываете метод обычной инструкцией call, а указатель на экземпляр объекта и затем список всех переменных передаёте через стек в обратном порядке, т.е. последний параметр кладётся в стек первым, это всё только для типа __stdcall. Если используется __fastcall, то указатель на экземпляр и первые 2 параметра передаются через eax, edx, ecx, соответственно. А, вообще, более универсальный способ вы можете подглядеть у компилятора, собрав исполняшку и оттрассировав её.
Указатель на экземпляр объекта всегда болтается в ecx (компилятор MS). Через стек его передает только GCC.
Re[3]: Как из ассемблерной вставки в С++ коде вызвать метод
Спасибо большое. Проблема еще и в том, чтобы протащить этот указатель на функцию-метод в ассемблерный код. Везде где ни читаю написано, что надо статичемкую функцию юзать, чтобы получить такой указатель и была возможность привести его к void*
Понимаю, что это уже к С++ вопрос относится — но все же, не можетели сказать, как , имея объект и описание класса, получить указатель на функцию-метод
То есть пользовтаель как-то должне вызвать мою SetCallback(void* obj, void* funcPtr)
Вот как пользовталю получить сторой аргумент?
Re[4]: Как из ассемблерной вставки в С++ коде вызвать метод
Да, это все лирика. Собственно, что в этом случае делал бы я. Написал бы простенькую прокси-функцию (не метод, ну, или статический метод), которая бы в качестве аргументов получала только указатель на объект и параметры метода, собственно вызывая его. И извне вызывал бы ее. Это и есть стандартная техника изготовления callback'ов для апи-шных функций.
Здравствуйте, Misha87, Вы писали:
M>У меня есть указатель на функцию — метод класса, у меня есть указатель на объект. Как из ассемблерной сатвки вызвать этот метод?
А какой в этом смысл? Почему не закрыть в этом месте скобку ассемблерной вставки, положив напоследок указатель в переменную, вызвать функцию обычным образом, и затем открыть вставку снова? Или вставка вычисляет параметры вызова, сишная функция оптимизирована до упора, и несколько лишних команд качественно испортят ситуацию?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Как из ассемблерной вставки в С++ коде вызвать метод
Однако, исходную задачу наверняка можно решить и без ассемблера.
... << RSDN@Home 1.2.0 alpha 4 rev. 1135>>
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth