Re[2]: Указатель на функцию
От: Андрей Тарасевич Беларусь  
Дата: 22.12.04 09:47
Оценка:
Здравствуйте, А.Якубовский, Вы писали:

АЯ>mov ecx, this — я пишу в некотором отступлении от стандартного асма, но что одаренным C++ программистам было понятно

АЯ>mov eax, dword ptr [ecx+4] — это к примеру вызов виртуального метода +4 это адресс виртуальной функции в таблице vtbl
АЯ>...

АЯ>push param1

АЯ>push param2
АЯ>push param3
АЯ>push ecx неявная передача this через стек
АЯ>call eax

АЯ>....


АЯ>Так вот если-б вы зоть раз соизволили сделать трасировку в асме, ВЫ бы подумали прежде чем написать что указатель может быть больше 32


Душит смех. Нет, молодой человек, если бы Вы хоть раз сделали трассировку правильно откомпилированной программы "в АСМЕ" и поcмотрели, как выглядит вызов метода класса через корректно сформированный указатель на метод класса, Вы бы никогда не стали писать здесь всю эту белиберду и публично садиться в лужу еще и с "асмом".

Специально для Вас я приведу здесь очень показательный пример этого самого "асма" для вызова метода класа через указатель.

Вот С++ код

#include <iostream>

struct A {
  int i;
  A() : i(1) {}
  void print() { std::cout << i << std::endl; }
};

struct B {
  int i;
  B() : i(2) {}
  void print() { std::cout << i << std::endl; }
};

struct C : A, B {
  int i;
  C() : i(3) {}
};

void call(C* pc, void (C::*pm)()) {
  (pc->*pm)();
}

int main() {
  C c;
  call(&c, &A::print);
  call(&c, &B::print);
}


А вот Вам ассмеблерный код функции 'call'

00401080   mov         eax,dword ptr [esp+4]
00401084   mov         ecx,dword ptr [esp+0Ch]
00401088   add         ecx,eax
0040108A   jmp         dword ptr [esp+8]


Поясню: обе выделенные жирным инструкции занимаются чтением частей указателя 'pm', который располагается в стеке по адресам esp+4 и esp+8. Советую вам тщательно разобрать этот код и хорошенько подумать о том, что же делают эти две инструкции и почему же это они читают из 32-хбитного (как Вы полагаете) указателя 64 бита информации.
Best regards,
Андрей Тарасевич
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.