Здравствуйте, А.Якубовский, Вы писали:
АЯ>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 бита информации.