Спасибо большое за предыдущие ответы, но я решил опять поднять этот топик дабы появился новый вопрос, помогите дураку, так вот, как мне в процедуре указать структуру через стек и еще как мне передать её в параметрах, тока укажите пожалуйста на фасмовские решения такой тупой задачки. Код (Text): ... proc GetParam structur1 local structur2: ISTRUCTUR ...
Ну разумнее всего - это получить указатель на эту структуру и передать ее функции. Можно сделать например так: Код (Text): ;возьмем память из стека под структуру sub esp, ((strsize shr 2)+1) shl 2 mov eax, esp ;заполним ее как-нибудь mov dword [eax+0], some_val ;передадим эту структуру push eax call procedure ;вытащим структуру из стека add esp, ((strsize shr 2)+1) shl 2 потом в стеке будет структура.
Регистрация класса окна с созданием структуры в стеке и передача указателя на эту структуру Код (Text): mov edi,ClassName invoke RegisterClass,esp,0,window_procedure,0,\ 0,400000h,0,10011h,COLOR_WINDOW+1,0,edi add esp,sizeof.WNDCLASS
Хе-хе вы меня наверно не поняли, я хотел что бы можно было работать примерно так: Код (Text): proc GetParam structur1 local structur2: ISTRUCTUR invoke lstrcpy structur2.string, sysstr mov ebx, [structur1] virtual at ebx struk ISTRUCTUR end virtual Но чета так в процедурах не прет... Помогите пожалуйста.
Mikl__ Вот тут могут возникнуть проблемы с загонкой в стек esp. Я стараюсь избегать команд типа push esp/pop esp т.к. на разных машинах они могут функционировать совершенно по разному. На одной машине будет так Код (Text): XXXXXX0C XXXXXXXX XXXXXX08 XXXXXXXX XXXXXX04 XXXXXX04 << esp XXXXXX00 XXXXXXXX А на другой так Код (Text): XXXXXX0C XXXXXXXX XXXXXX08 XXXXXXXX XXXXXX04 XXXXXX08 << esp XXXXXX00 XXXXXXXX Everhest А кто мешает сделать также, только наоборот. Главное помнить про стек. Ведь по возврату из процедуры данные ушедшие из стека не затираются до момента, когда эта память вновь не понадобится. Но это обходится легко. скажем так. Код (Text): ;главная программа ... call proc mov esi, eax mov edi, buf mov ecx, len rep movsb ;все. можно использовать структуру из buf. Можно обойтись и без копирования, но придется очень тщательно следить за стеком и остерегаться системных вызовов. ... proc: ... ;выделяем память по ходу выполнения алгоритма или в локальных переменных (в этом случае не придется беспокоится о достижение структуры указателем стека) lea ebx, [esp-100] ;используем память, но помним простек ... ;возвращаем структуру из процедуры mov eax, ebx ret
Они функционируют совершенно стандартно: push <что-нибудь> сначала читает значение, а потом уменьшает esp, а pop соответственно наоборот - сначала увеличивают esp, а потом записывают значение. Это поведение стандартизировано ещё с 80286 (популярный способ отличить 8086 от 80286 основан на "push sp/pop ax/cmp ax,sp"), так что если используются 32-битные регистры, то никаких "по-разному" с push/pop быть не может. Вот с call - да, бывают проблемы (http://www.wasm.ru/forum/viewtopic.php?id=10566). В подтверждение - цитатка из Intel'овских мануалов (том 2b) - этот момент подчёркнут: И ещё одна оттуда же, раздел "IA-32 Architecture Compatibility":