· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› ООП. Функция-член на АСМ.

<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . >>

Посл.отвђт Сообщен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]

<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.050