почему когда я в фасме вызываю msvcrt'шный printf он отрабатывает нормально, за исключением \n \t и т.д. последовательностей =\ cinvoke printf,"blabla\nbla" он так и печатает: blabla\nbla cinvoke как-то особенно обрабатывает строки?
\ в Си работает как escape символ, а в асме нужно управляющие символы явно прописывать. попробуй cinvoke printf,<"blabla", 0xA, "bla]
wow пасиба... а еще почему не работает такая штука Код (Text): proc qqqq locals buff db 10240 dup(?) endl cinvoke printf,<"blabla", 0xA, "bla] ret endp Просто молчаливый вылет :\ а если буфер 1024 то норм.. это ограничение локального стека.. или как там его ?
больше 4096 байт лучше не ставить. Страницы в Intel x86 по 4096 байт, когда делаешь локальную переменную fasm за тебя подставляет sub esp, xxx. Если указатель стека не выходит за текущую страницу, все нормально. Если выходишь со своей страницы стека на соседнюю, возникает исключение, и Винда его обрабатывает, выделяю эту страницу твоей программе. Если же sub esp, 10000 то ты вылетаешь за сторожевую страницу Винды и срабатывает ее защита.
Код (Text): macro stackprobe procname,flag,parmbytes,localbytes,reglist { if parmbytes | localbytes push ebp mov ebp,esp if localbytes if localbytes mod 1000h sub esp,localbytes mod 1000h end if repeat localbytes/1000h sub esp,1000h mov [esp],eax end repeat end if end if if ~ reglist eq save@regs reglist end if } prologue@proc equ stackprobe proc qqqq locals buff db 10240 dup(?) endl cinvoke printf,<"blabla", 0xA, "bla] ret endp
По умолчанию под стэк выделяется 2 страницы, следом (в сторону младших адресов или "ниже") идёт сторожевая страница. Если обратиться к адресам ниже сторожевой страницы, то возникнет exeption, т.к. страницы на эти адреса не отображены. А если обратиться к сторожевой странице, то система сменит её атрибуты, сделав её "обычной" (увеличит стэк) и подключит ниже новую сторожевую страницу. Код сгенерированный макросом stackprobe и обращается по очереди к сторожевым страницам, увеличивая стэк до нужных размеров.