Стэк - только не родной.

Тема в разделе "WASM.BEGINNERS", создана пользователем Everhest, 4 июн 2008.

  1. Everhest

    Everhest New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2007
    Сообщения:
    105
    Спасибо большое за предыдущие ответы, но я решил опять поднять этот топик дабы появился новый вопрос, помогите дураку, так вот, как мне в процедуре указать структуру через стек и еще как мне передать её в параметрах, тока укажите пожалуйста на фасмовские решения такой тупой задачки.

    Код (Text):
    1. ...
    2. proc GetParam structur1
    3.  
    4.       local structur2: ISTRUCTUR
    5. ...
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Ну разумнее всего - это получить указатель на эту структуру и передать ее функции. Можно сделать например так:
    Код (Text):
    1. ;возьмем память из стека под структуру
    2. sub esp, ((strsize shr 2)+1) shl 2
    3. mov eax, esp
    4. ;заполним ее как-нибудь
    5. mov dword [eax+0], some_val
    6. ;передадим эту структуру
    7. push eax
    8. call procedure
    9. ;вытащим структуру из стека
    10. add esp, ((strsize shr 2)+1) shl 2
    потом в стеке будет структура.
     
  3. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Регистрация класса окна с созданием структуры в стеке и передача указателя на эту структуру
    Код (Text):
    1.       mov edi,ClassName
    2.       invoke RegisterClass,esp,0,window_procedure,0,\
    3.       0,400000h,0,10011h,COLOR_WINDOW+1,0,edi
    4.       add esp,sizeof.WNDCLASS
     
  4. Everhest

    Everhest New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2007
    Сообщения:
    105
    Хе-хе вы меня наверно не поняли, я хотел что бы можно было работать примерно так:

    Код (Text):
    1. proc GetParam structur1
    2.  
    3.       local structur2: ISTRUCTUR
    4.  
    5.  
    6.          invoke   lstrcpy  structur2.string, sysstr
    7.          mov      ebx, [structur1]
    8.          virtual at ebx
    9.             struk ISTRUCTUR
    10.          end virtual
    Но чета так в процедурах не прет... :dntknw: Помогите пожалуйста.
     
  5. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Mikl__
    Вот тут могут возникнуть проблемы с загонкой в стек esp. Я стараюсь избегать команд типа push esp/pop esp т.к. на разных машинах они могут функционировать совершенно по разному.
    На одной машине будет так
    Код (Text):
    1. XXXXXX0C  XXXXXXXX
    2. XXXXXX08  XXXXXXXX
    3. XXXXXX04  XXXXXX04 << esp
    4. XXXXXX00  XXXXXXXX
    А на другой так
    Код (Text):
    1. XXXXXX0C  XXXXXXXX
    2. XXXXXX08  XXXXXXXX
    3. XXXXXX04  XXXXXX08 << esp
    4. XXXXXX00  XXXXXXXX
    Everhest
    А кто мешает сделать также, только наоборот. Главное помнить про стек. Ведь по возврату из процедуры данные ушедшие из стека не затираются до момента, когда эта память вновь не понадобится. Но это обходится легко. скажем так.
    Код (Text):
    1. ;главная программа
    2. ...
    3. call proc
    4. mov esi, eax
    5. mov edi, buf
    6. mov ecx, len
    7. rep movsb
    8. ;все. можно использовать структуру из buf. Можно обойтись и без копирования, но придется очень тщательно следить за стеком и остерегаться системных вызовов.
    9. ...
    10. proc:
    11.   ...
    12. ;выделяем память по ходу выполнения алгоритма или в локальных переменных (в этом случае не придется беспокоится о достижение структуры указателем стека)
    13.   lea ebx, [esp-100]
    14. ;используем память, но помним простек
    15.   ...
    16. ;возвращаем структуру из процедуры
    17.   mov eax, ebx
    18.   ret
     
  6. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Они функционируют совершенно стандартно: 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":
     
  7. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    diamond
    Спс. Последнего не видел. Или не помню.
     
  8. Everhest

    Everhest New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2007
    Сообщения:
    105
    Спасибо всем, респект вам! Топик думаю можно закрыть...