|
|
| Посл.отвђт | Сообщен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 ENDPIMO, всё равно, лучше сохранять регистры именно там, где они используются, т.е. в самой 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). |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.060 |