Доброе время суток, как мне создать свой стек и как переменно пользоваться родным и которым я сам сделал? Прошу прощение за дикий вопрос, но нужно срочно и попотробней!
попробуй так Код (Text): .data progsp dd 0 myst dd 0 mysp dd 0 .code push sizeofmystack push 64 call GlobalAlloc mov myst, eax mov progsp, esp lea esp, [eax+sizeofmystack+4] mov mysp, esp ;здесь пользуемся своим ... ;здесь програмным mov mysp, esp mov esp, progsp ... или 16 битный код, но выделять память лучше заранее Код (Text): .data progss dw 0 progsp dw 0 mysp dw offset endofprogram+100h myss dw seg endofprogram .code mov progss, ss mov progsp, sp mov ax, myss mov ss, ax mov sp, mysp ;здесь свой ... ;здесь программы mov mysp, sp mov myss, ss mov ax, progss mov ss, ax mov sp, progsp ... endofprogram: Использовать так же как и обычный. Ну или попробуй написать подпрограммы для работы со стеком заменяющие команды push и pop.
LIFO - Last input first output - последним положили первым взяли. Это основной принцип стека. Это даже в гугле можно было найти.
=) решил поднять тему. Код (Text): .data AppName db "ччч",0 textbox db "Ok",0 _esp dd 0 prog_esp dd 0 myst dd 0 .code start: push 4000 push 64 call GlobalAlloc mov myst, eax mov prog_esp, esp lea esp, [eax+4000] mov _esp, esp ;здесь пользуемся своим push 0;MB_OK push offset AppName push offset textbox;offset buffer push 0 call MessageBox ;... И все =) , месадж бокс так и не выходит , происходит исключение. И прога валится. Врод условия работы со стэком правильны.
Попробуй так: Код (Text): lea esp, [eax + 4000 - 1] and esp, 0xFFFFFFFC P.S. Отладчик в таких случаях помогает.
=) я под ольгой смотрю. Такое очучение что выделенная память ограничена чем то. Неа не важно ...падает теперь уже с ошибкой ERROR_MOD_NOT_FOUND (0000007E) ... а ранее вообще ошибки не показывала. В стэк заносится все верно вроде.
Код (Text): .386 .model flat, stdcall option casemap:none include c:\masm32\include\windows.inc includelib c:\masm32\lib\user32.lib includelib c:\masm32\lib\comctl32.lib include c:\masm32\include\user32.inc include c:\masm32\include\kernel32.inc includelib c:\masm32\lib\kernel32.lib include c:\masm32\include\comctl32.inc includelib c:\masm32\lib\wsock32.lib include c:\masm32\include\wsock32.inc include c:\masm32\include\gdi32.inc includelib c:\masm32\lib\gdi32.lib include c:\masm32\include\shell32.inc includelib c:\masm32\lib\shell32.lib includelib c:\masm32\lib\ws2_32.lib include c:\masm32\include\advapi32.inc includelib c:\masm32\lib\advapi32.lib includelib \masm32\lib\winmm.lib .data AppName db "ччч",0 textbox db "Ok",0 _esp dd 0 prog_esp dd 0 myst dd 0 .code start: push 4000 push 64 call GlobalAlloc mov myst, eax mov prog_esp, esp lea esp, [eax + 4000 - 1] and esp, 0xFFFFFFFC mov _esp, esp ;здесь пользуемся своим push 0;MB_OK push offset AppName push offset textbox;offset buffer push 0 call MessageBox @exit: invoke ExitProcess, 0 end start не имеет значения =(
=) да верно , он был слишком мал. Интересно как определить стэк нужный. Или расгирять его потом когда надо , но когда уже сделан колл то это не реально мне так кажется
Можно сделать так, как делает это Windows (точнее, CRT) -- выделяешь достаточно большой участок памяти с параметром MEM_RESERVE. В нем делаешь COMMIT нескольким страницам. Последней странице ставишь параметр PAGE_GUARD, и ловишь исключения при обращении к этой странице. По факту исключения делаешь COMMIT следующей странице стека и двигаешь PAGE_GUARD к младшим адресам. Если место закончилось, значит, Stack Overflow. Правда тут надо быть осторжным, т.к. можно пересечься со "стандартным" механизмом увеличения стека, если используется CRT.
=) ммм ..спасибо. Может тогда еще и свой пуш вот так скажем Код (Text): _push MACRO v mov [_esp],dword ptr v sub _esp,4 ENDM а код поменять на так push 4000 push 64 call GlobalAlloc mov myst, eax mov prog_esp, esp lea esp, [eax + 4000 - 1] mov _esp, esp ;здесь пользуемся своим _push 0;MB_OK _push offset AppName _push offset textbox;offset buffer _push 0 mov esp, _esp call MessageBox ???
Да я это уже увидел , я все мыслил по старому алго он другой был. Тут будет иначе ... Затем чтобы свою команду пушь сделать. И свой стэк =)
А че тут 64 в стек запихивают, там вроде флаги надо впихивать или я путаюсь? max7C4 Нет, мне нужны подробные описания, хотя думаю сам по примерам разбирусь.
Вообще-то для вызова API такой подход не годится. Просто система контролирует стек. Мало того адреса стека должны быть кратны 4. т.е. Код (Text): sub esp, 399 mov edx, esp push edx call [SomeAPIFunction] это всегда завершается ошибкой. Т.е. если хочешь использовать для своих целей типа хранения данных - это запросто, но системные вызовы - только с родным или см VirtualAlloc