fasm printf \n

Тема в разделе "WASM.ASSEMBLER", создана пользователем FaceOFF, 29 июл 2005.

  1. FaceOFF

    FaceOFF New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2004
    Сообщения:
    11
    почему когда я в фасме вызываю msvcrt'шный printf он отрабатывает нормально, за исключением \n \t и т.д. последовательностей =\



    cinvoke printf,"blabla\nbla"



    он так и печатает: blabla\nbla



    cinvoke как-то особенно обрабатывает строки?
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    \ в Си работает как escape символ, а в асме нужно управляющие символы явно прописывать.

    попробуй



    cinvoke printf,<"blabla", 0xA, "bla]
     
  3. FaceOFF

    FaceOFF New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2004
    Сообщения:
    11
    wow пасиба...

    а еще почему не работает такая штука
    Код (Text):
    1.  
    2. proc qqqq
    3. locals
    4.   buff db 10240 dup(?)
    5. endl
    6.     cinvoke printf,<"blabla", 0xA, "bla]
    7. ret
    8. endp
    9.  




    Просто молчаливый вылет :\ а если буфер 1024 то норм.. это ограничение локального стека.. или как там его :lol: ?
     
  4. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    больше 4096 байт лучше не ставить.

    Страницы в Intel x86 по 4096 байт, когда делаешь локальную переменную fasm за тебя подставляет sub esp, xxx.

    Если указатель стека не выходит за текущую страницу, все нормально. Если выходишь со своей страницы стека на соседнюю, возникает исключение, и Винда его обрабатывает, выделяю эту страницу твоей программе. Если же sub esp, 10000 то ты вылетаешь за сторожевую страницу Винды и срабатывает ее защита.
     
  5. Privalov

    Privalov New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2004
    Сообщения:
    16
    Код (Text):
    1. macro stackprobe procname,flag,parmbytes,localbytes,reglist
    2.  { if parmbytes | localbytes
    3.     push ebp
    4.     mov ebp,esp
    5.     if localbytes
    6.      if localbytes mod 1000h
    7.       sub esp,localbytes mod 1000h
    8.      end if
    9.      repeat localbytes/1000h
    10.       sub esp,1000h
    11.       mov [esp],eax
    12.      end repeat
    13.     end if
    14.    end if
    15.    if ~ reglist eq
    16.     save@regs reglist
    17.    end if }
    18.  
    19. prologue@proc equ stackprobe
    20.  
    21. proc qqqq
    22. locals
    23.   buff db 10240 dup(?)
    24. endl
    25.     cinvoke printf,<"blabla", 0xA, "bla]
    26. ret
    27. endp
     
  6. FaceOFF

    FaceOFF New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2004
    Сообщения:
    11
    8)

    нифига... а можно рассказать что это значит? а то я как-то... не того этого :dntknw: :lol:
     
  7. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    По умолчанию под стэк выделяется 2 страницы, следом (в сторону младших адресов или "ниже") идёт сторожевая страница. Если обратиться к адресам ниже сторожевой страницы, то возникнет exeption, т.к. страницы на эти адреса не отображены. А если обратиться к сторожевой странице, то система сменит её атрибуты, сделав её "обычной" (увеличит стэк) и подключит ниже новую сторожевую страницу. Код сгенерированный макросом stackprobe и обращается по очереди к сторожевым страницам, увеличивая стэк до нужных размеров.