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

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

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

Посл.отвђт Сообщенiе


Дата: Сен 19, 2003 21:53:11

А как такую задумку выполнить наиболее эффектно??
Есть класс (НУ К ПРИМЕРУ!!)
class My_CLASS{
public:
void my_function(int param1, int param2);

private:
int i;
int j;
};
void My_CLASS::my_function(int param1, int param2)
{
i=param1+param2;
};

ТАК ВОТ МОЖНО ЛИ КАК ТО?? сделать на ассемблере такую функцию-ЧЛЕН!!!!??
Сдесь изюминка не сама функция а передача параметров!! Если кто делал уже такое или задумки есть... БУДЕТ ОЧЕНЬ ИНТЕРЕСНО!!! ХЕЛП!!!


Дата: Сен 20, 2003 11:22:54

emergenter
Вот она же на ASM
my_function  proc

      push ebp
      mov  ebp,esp

this   EQU  dword ptr [ebp+8] ;; Указатель на структуру
                              ;; класса
param1 EQU  dword ptr [ebp+12]
param2 EQU  dword ptr [ebp+16]


my_function  endp


Дата: Сен 20, 2003 11:24:09

emergenter
А можно this и в eax передавать.. Как хочите.
Или в ebx - это даже лучше!!!


Дата: Сен 20, 2003 17:01:28

EBX очень хорош для 'this'.
Он остаётся нетронутым при вызовах Win32 API.


Дата: Сен 20, 2003 20:30:50

Только не забудьте перед употреблением сохранить этот регистр, во избежание жутких багов.


Дата: Сен 20, 2003 22:26:13

EBX надо сохранять только если он используется в CALLBACK функции (WndProc например или DlgProc).


Дата: Сен 21, 2003 19:48:21

В данном случае EBX нужно сохранить, ведь объект должен работать в любых условиях (callback, не callback). Тоже самое относится к ESI и EDI. Иначе потом багов не оберёшься.


Дата: Сен 22, 2003 21:10:24

Не совсем согласен...
MyWndProc Proc StdCall hWnd:HWND,uiMsg:UINT,wp:WPARAM,lp:LPARAM
  Push ebx
  Push esi
  Push edi

  ; ... can use anything here in any manner...
  Call Foo

  Pop edi
  Pop esi
  Pop ebx
  Ret
MyWndProc EndP

Внутри процедуры Foo не надо беспокоиться о EBX.


Дата: Сен 22, 2003 21:51:03

Или так:
MyWndProc PROC uses ebx,esi,edi hWnd:HWND,uiMsg:UINT,wp:WPARAM,lp:LPARAM
call Foo
ret
MyWndProc ENDP
IMO, всё равно, лучше сохранять регистры именно там, где они используются, т.е. в самой Foo.


Дата: Сен 23, 2003 03:59:17

Опять не согласен...
Кстати, Вы подняли интересный философский вопрос: должна ли функция сохранять ВСЕ регистры, которые портятся в результате работы этой функции?
Иначе говоря:
mov  esi, offset [strHello]
call foo1
call foo2
call foo3
; --- Will ESI still contain here 'offset [strHello]'?

Если посмотреть на код, генерируемый компилятором С/С++, то видно, что этого не происходит (не все регистры сохранены). Наверное, есть этому причина. Вот например:
; --- Code #1:
Foo proc
  push edx
  ; ... work with EDX here ...
  pop  edx
  ret
Foo endp

Foo2 proc
  push edx
  ; ... work with EDX here too ...
  pop  edx
  ret
Foo2 endp

...

mov  edx, value
Call Foo
Call Foo2    ; Here EDX also needed as 'value'
А теперь таким образом:
; --- Code #2:
Foo proc
  ; ... work with EDX here ...
  ret
Foo endp

Foo2 proc
  ; ... work with EDX here too ...
  ret
Foo2 endp

...

mov  edx, value
Call Foo
mov  edx, value
Call Foo2         ; Here EDX also needed as 'value'

Сравнивая эти фрагменты - видим, что убирая 4 операции со стэком (2 вызова, в каждом PUSH/POP), мы должны только перезагрузить EDX один раз. Больше регистров использовано - больше 'overhead' - ведь вызов может произойти также там, где не надо сохранение именно этих регистров.


Дата: Сен 23, 2003 19:54:11

Quantum
Хватит бессмысленный спор разводить!
Если функция вызвана так, что edx ets можно менять.
То стало быть в этом соглашения смысл.
И будет код верен, если его применять.


Дата: Сен 23, 2003 20:16:23

Edmond
8-|
Мы тут спорим о необходимости сохранения регистра под this в объекте!!! Соглашения тут особой роли не играют. Насколько я знаю, callback не требует сохранения EDI (только EBX), т.е. может соглашение того и требует, но на практике можно спокойно менять EDI. Зато в тредах обязательно нужно сохранять ESI/EDI. Так вот, мы заранее не знаем, где будет использоваться наш объект (callback, тред, обычный код после метки start, etc.) Стало быть, this-хранящий регистр лучше сохранить от греха подальше. Или я не прав?


Дата: Сен 23, 2003 20:49:53

А можно this и в eax передавать.. Как хочите.
Или в ebx - это даже лучше!!!


Т.е. как я понял, отказаться от соглашений в C и передавать this не через стек, а в регистре ...
Вопрос - чего его тогда сохранять?


Дата: Сен 23, 2003 20:51:02

Quantum
Если вы делаете это под Win32.
То я вообще спора не вижу.
Можно хранить в ebx
Потому что esi/edi -- часто заняты.
ebx не изменяется при вызовах функции, и в потоках..

Зато в тредах обязательно нужно сохранять ESI/EDI.

Этого вообще не пойму.. От кого сохранять???

---------------------------------------
То есть, если вы договариваетесь, что в ebx -- передаётся указатель, то выигрышь получится хорошим.


Дата: Сен 23, 2003 21:07:39 · Поправил: Quantum

От кого сохранять???
Например:
useEDI PROC
 inc edi
 ret
useEDI ENDP
Если эту ф-цию вызвать в callback (DlgProc, WndProc, ...), то ничего страшного не произойдёт. Зато, если её вызвать в треде, по окончанию треда вылетит исключение. Такое наблюдается под WinME, причём исключение происходит именно по окончанию треда (после ret).

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


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