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

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

  1. Everhest

    Everhest New Member

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

    Прошу прощение за дикий вопрос, но нужно срочно и попотробней!
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    попробуй так
    Код (Text):
    1. .data
    2. progsp     dd 0
    3. myst       dd 0
    4. mysp       dd 0
    5. .code
    6. push sizeofmystack
    7. push 64
    8. call GlobalAlloc
    9. mov myst, eax
    10. mov progsp, esp
    11. lea esp, [eax+sizeofmystack+4]
    12. mov mysp, esp
    13. ;здесь пользуемся своим
    14.  
    15. ...
    16.  
    17. ;здесь програмным
    18. mov mysp, esp
    19. mov esp, progsp
    20.  
    21. ...
    или 16 битный код, но выделять память лучше заранее
    Код (Text):
    1. .data
    2. progss  dw 0
    3. progsp  dw 0
    4. mysp    dw offset endofprogram+100h
    5. myss    dw seg endofprogram
    6. .code
    7. mov progss, ss
    8. mov progsp, sp
    9. mov ax, myss
    10. mov ss, ax
    11. mov sp, mysp
    12. ;здесь свой
    13.  
    14. ...
    15.  
    16. ;здесь программы
    17. mov mysp, sp
    18. mov myss, ss
    19. mov ax, progss
    20. mov ss, ax
    21. mov sp, progsp
    22.  
    23. ...
    24.  
    25. endofprogram:
    Использовать так же как и обычный. Ну или попробуй написать подпрограммы для работы со стеком заменяющие команды push и pop.
     
  3. Everhest

    Everhest New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2007
    Сообщения:
    105
    Спасибо max7C4. Ну а учебников или умных ссылок не будет? Мне еще нужно инфа о том, что такое LIFO.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Какие нужны учебники чтобы просто-напросто перезаписать ESP?
     
  5. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    LIFO - Last input first output - последним положили первым взяли. Это основной принцип стека. Это даже в гугле можно было найти.
     
  6. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    =) решил поднять тему.

    Код (Text):
    1. .data
    2. AppName db "ччч",0
    3. textbox db "Ok",0
    4. _esp dd 0
    5. prog_esp     dd 0
    6. myst dd 0
    7. .code
    8. start:
    9.  
    10. push 4000
    11. push 64
    12. call GlobalAlloc
    13. mov myst, eax
    14. mov prog_esp, esp
    15. lea esp, [eax+4000]
    16. mov _esp, esp
    17. ;здесь пользуемся своим
    18. push 0;MB_OK
    19. push offset AppName
    20. push offset textbox;offset buffer
    21. push 0
    22. call MessageBox
    23. ;...
    И все =) , месадж бокс так и не выходит , происходит исключение. И прога валится. Врод условия работы со стэком правильны.
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Попробуй так:

    Код (Text):
    1. lea esp, [eax + 4000 - 1]
    2. and esp, 0xFFFFFFFC
    P.S. Отладчик в таких случаях помогает.
     
  8. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    =) я под ольгой смотрю. Такое очучение что выделенная память ограничена чем то. Неа не важно ...падает теперь уже с ошибкой ERROR_MOD_NOT_FOUND (0000007E) ... а ранее вообще ошибки не показывала. В стэк заносится все верно вроде.
     
  9. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Покажи код. ERROR_MOD_NOT_FOUND устанавливает LoadLibrary.
     
  10. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    calidus
    А если сделать Release версию, ошибка возникает?
     
  11. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4. include c:\masm32\include\windows.inc
    5. includelib c:\masm32\lib\user32.lib
    6. includelib c:\masm32\lib\comctl32.lib
    7.    include c:\masm32\include\user32.inc
    8.    include c:\masm32\include\kernel32.inc
    9.    includelib c:\masm32\lib\kernel32.lib
    10.    include c:\masm32\include\comctl32.inc
    11. includelib c:\masm32\lib\wsock32.lib
    12. include c:\masm32\include\wsock32.inc
    13.    include c:\masm32\include\gdi32.inc
    14.    includelib c:\masm32\lib\gdi32.lib
    15.    include c:\masm32\include\shell32.inc
    16.    includelib c:\masm32\lib\shell32.lib
    17.    includelib c:\masm32\lib\ws2_32.lib
    18.   include c:\masm32\include\advapi32.inc
    19.   includelib c:\masm32\lib\advapi32.lib
    20.   includelib \masm32\lib\winmm.lib
    21. .data
    22. AppName db "ччч",0
    23. textbox db "Ok",0
    24. _esp dd 0
    25. prog_esp     dd 0
    26. myst dd 0
    27. .code
    28. start:
    29.  
    30. push 4000
    31. push 64
    32. call GlobalAlloc
    33. mov myst, eax
    34. mov prog_esp, esp
    35. lea esp, [eax + 4000 - 1]
    36. and esp, 0xFFFFFFFC
    37. mov _esp, esp
    38. ;здесь пользуемся своим
    39. push 0;MB_OK
    40. push offset AppName
    41. push offset textbox;offset buffer
    42. push 0
    43. call MessageBox
    44.  
    45. @exit:
    46.     invoke ExitProcess, 0
    47. end start
    не имеет значения =(
     
  12. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Попробуй увеличить размер твоего стека. Подозреваю, что 4000 байт не хватает.
     
  13. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    =) да верно , он был слишком мал. Интересно как определить стэк нужный. Или расгирять его потом когда надо , но когда уже сделан колл то это не реально мне так кажется
     
  14. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Можно сделать так, как делает это Windows (точнее, CRT) -- выделяешь достаточно большой участок памяти с параметром MEM_RESERVE. В нем делаешь COMMIT нескольким страницам. Последней странице ставишь параметр PAGE_GUARD, и ловишь исключения при обращении к этой странице. По факту исключения делаешь COMMIT следующей странице стека и двигаешь PAGE_GUARD к младшим адресам. Если место закончилось, значит, Stack Overflow. Правда тут надо быть осторжным, т.к. можно пересечься со "стандартным" механизмом увеличения стека, если используется CRT.
     
  15. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    =) ммм ..спасибо. Может тогда еще и свой пуш
    вот так скажем
    Код (Text):
    1. _push   MACRO   v
    2.          mov [_esp],dword ptr v
    3.          sub _esp,4
    4.         ENDM
    5. а код поменять на так
    6.  
    7. push 4000
    8. push 64
    9. call GlobalAlloc
    10. mov myst, eax
    11. mov prog_esp, esp
    12. lea esp, [eax + 4000 - 1]
    13. mov _esp, esp
    14. ;здесь пользуемся своим
    15. _push 0;MB_OK
    16. _push offset AppName
    17. _push offset textbox;offset buffer
    18. _push 0
    19. mov esp, _esp
    20. call MessageBox
    ???
     
  16. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Хм. А зачем?.. Тем более, что первая запись в стек выйдет за границы выделенной памяти.
     
  17. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    Да я это уже увидел , я все мыслил по старому алго он другой был. Тут будет иначе ... Затем чтобы свою команду пушь сделать. И свой стэк =)
     
  18. Everhest

    Everhest New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2007
    Сообщения:
    105
    А че тут 64 в стек запихивают, там вроде флаги надо впихивать или я путаюсь?

    max7C4

    Нет, мне нужны подробные описания, хотя думаю сам по примерам разбирусь.
     
  19. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    64 это режим памяти , рид врайт и так далее ..
     
  20. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Вообще-то для вызова API такой подход не годится. Просто система контролирует стек. Мало того адреса стека должны быть кратны 4. т.е.
    Код (Text):
    1. sub esp, 399
    2. mov edx, esp
    3. push edx
    4. call [SomeAPIFunction]
    это всегда завершается ошибкой.
    Т.е. если хочешь использовать для своих целей типа хранения данных - это запросто, но системные вызовы - только с родным или см VirtualAlloc