|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 25, 2003 00:20:58 Edmond Если можешь помочь так помогай а то ПОСЫЛАЕШЬ по каким-то ссылкам... |
|
|
Дата: Сен 25, 2003 00:46:39 Edmond проблема в том что я не понимаю как именно можно и можно ли вообще заменит функцию член написанную на Си на асемблеровскую ФУНКЦИЮ-ЧЛЕН!!! ну опять же приведу пример!! class My_love_class{ public: My_love_class(); void setznachenie (int, int) private: int param1; int param2; int i; }; My_love_class::setznach(int pr1; int pr2){ param1=pr1; param2=pr2; i=param1+param2; } Вот как такую функцию член заменить!!! Вроде как pr1 и pr2 можно получить через СТЕК, param1, param2 как глобальные переменные передать, ну арифетические действия понятно!!!! А смущает именно вот это My_love_class::setznach Как с этим быть!!! Функция должна находиться в классе... как такое сделать!! НУ если ты делал то можешь ведь подсказат ТЕХНИЧЕКИ как подойти к этому вопросу... а слышу и вижу только очень абстрагированную теорию... ЗАЧЕМ если можно выразить все в практических действиях.... если конечно знать... |
|
|
Дата: Сен 25, 2003 01:05:39 В точности такую операцию не получится сделать на ассемблере - нет таких средств. Что делает компилятор С++? Он просто комбинирует имя класса и имя функции: MyClass@@SetValue_xxx - что-то в этом роде. Где xxx выражает параметры функции и возвращаемое значение. Кроме того, выражение "внутри класса" - это всего лишь абстракция, чтобы легче было писать на С++. На ассемблере надо сделать то же самое: ; -------------------------------------------------- ; EBX <- 'this' of MyClass instance ; -------------------------------------------------- MyClass_SetValue Proc ; --- Using EBX you got access to all data inside... Ret MyClass_SetValue EndP |
|
|
Дата: Сен 25, 2003 09:38:00 А как в C++ передается this, в регистре, или через стек? |
|
|
Дата: Сен 25, 2003 16:03:55 this - это указатель на клас!! Я правильно понял?? |
|
|
Дата: Сен 25, 2003 16:33:36 emergenter this это указатель на ОБЪЕКТ!!! А если говорить проще -- на структуру данных. |
|
|
Дата: Сен 25, 2003 17:34:46 ssx Если посмотреть на ассемблерный код из VC++, то видно, что иногда 'this' в ECX, а иногда в стеке. Я, правда не стал разбираться когда как... |
|
|
Дата: Сен 25, 2003 17:52:18 Edmond AsmGuru62 ТАк а как тогда грамотно написать функцию ЧЛЕН?? |
|
|
Дата: Сен 25, 2003 17:56:10 · Поправил: AsmGuru62 Просто комбинировать имя класса и имя функции, как в моём примере выше и передавать this каким угодно способом. Самая интересная часть - это, конечно, наследование и виртуальные методы. Кстати, я посылал Вам (emergenter) мою статью по этому поводу, только она на английском. |
|
|
Дата: Сен 25, 2003 18:36:59 emergenter Так вы ДЛЯ С++? |
|
|
Дата: Сен 25, 2003 18:55:07 AsmGuru62 Насколько я разбирался this от функции к функции только в ecx переходит, просто внутри функции от на стеке идет, потому что апи функции не гаранитируют неприкосновенности ecx, а конце все опять в ecx и выходит. Немножко геморойная схема, но так все и работает :) |
|
|
Дата: Сен 25, 2003 21:57:16 Чтобы this передавался через стек нужно в объявлении класса перед именем метода __stdcall написать. Это наверное какая-то оптимизация, только отключить ее нельзя. |
|
|
Дата: Сен 25, 2003 22:36:12 ТАК КТО НИБУДЬ ЗДЕСЬ ПОКАЖЕТ КАК ИМЕННО ПЕРЕДАТЬ этот THIS!!!! И что с ним делать вообще? |
|
|
Дата: Сен 26, 2003 01:39:55 Edmond Black_mirror masquer НУ ТАК ПОЯСНИТЕ НА ПРИМЕРЕ ЧТО ЕСТЬ ЧТО!!! Пожалуйста |
|
|
Дата: Сен 26, 2003 04:19:25 · Поправил: Black_mirror
struc my_class
{
.i dd ?
.j dd ?
.constructor?=my_class@constructor?
.constructor?dd=my_class@constructor?dd
.my_function?dd=my_class@my_function?dd
.destructor?=my_class@destructor?
.Size = $-.i
}
virtual at 0
my_class my_class
end virtual
my_class@constructor?:;(this +4)
mov edx,[esp+4]
mov [edx+my_class.i],0
mov [edx+my_class.j],0
ret 4
my_class@constructor?dd:;(this +4, p1 +8, p2 +12)
mov edx,[esp+4]
mov eax,[esp+8]
mov [edx+my_class.i],eax
mov eax,[esp+12]
mov [edx+my_class.j],eax
ret 4
my_class@my_function?dd:;(this +4, p1 +8, p2 +12)
mov eax,[esp+8];p1
add eax,[esp+12];p2
mov edx,[esp+4];this
mov [edx+my_class.i],eax
ret 12
my_class@destructor?:;(this +4)
ret 4
my_obj my_class ?
pmy_obj dd ?
stdcall my_obj.constructor,my_obj
stdcall my_obj.my_function?dd,my_obj,2,3
stdcall my_obj.destructor?,my_obj
stdcall alloc,my_class.Size
mov [pmy_obj]
stdcall my_obj.constructor?dd,[pmy_obj],1,2
stdcall my_obj.my_function?dd,[pmy_obj],2,3
stdcall my_obj.destructor?,[pmy_obj]
stdcall free,[pmy_obj]
|
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.050 |