Как обнулить локальный буфер

Тема в разделе "WASM.BEGINNERS", создана пользователем devillsd, 14 дек 2008.

  1. devillsd

    devillsd New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    131
    Емееться локальный буфер в функции LOCAL buff[0190h]:BYTE
    Мне нужно всегда знать конец данных в нём
    А так как создаёться он в стеке, то весь замусорен,
    как проще всего и быстрее заполнить его нулями???
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    rep stosd проще
    её разбивка на отдельные команды mov + sub + jnz чуть быстрее, но здесь это вряд ли принципиально ;)
     
  3. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    devillsd
    xor eax, eax
    mov ecx, sizeof BUFFER/4
    lea edi, BUFFER
    rep stosd

    ЗЫ Правильное название темы: "Как обнулировать локальный буфер?" )))
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Еще один.. не обнулировать, а обнулить.
    А топикстартеру - аннулировать - это немного другое.

    а вообще размер не обязательно может быть кратен четырем.
    тогда
    xor eax,eax
    mov edx, size
    mov edi, buffer
    mov ecx, edx
    shr ecx, 2
    rep stosd
    mov ecx, edx
    and ecx, 3
    rep stosb
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    но этой ситуации при выделении локального буфера в стеке лучше старательно избегать, тем более что случай когда 1-3 выравнивающих байта в конце буфера чему-то мешают исключительно редкий ;)

    И ещё нюанс - если размер локального буфера больше страницы памяти (4кб), то при первом заполнении буфера (в нашем случае обнулении) следует двигаться по ходу роста стека т.е. от конца буфера с уменьшением адреса (для std rep movsd не забыть вернуть флаг направления в растущее - cld). После того как буфер один раз заполнен (нулями или ещё чем-то) обращаться к нему можно в любом порядке. Это связано с тем что страницы памяти выделяются стеку по мере необходимости и при этом винда, обнаружив пропущенную страницу, считает что программа заполняет стек неадекватно и роняет её ;) а заполнение большого буфера требуещего нескольких страниц памяти "от начала к концу" именно так со стороны win и выглядит.
     
  6. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    Great
    Ну не знаю. Мне показалось, что "обнулировать" как-то поприкольнее звучит)). Не так обыденно, скажем.
     
  7. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    первое название - онолировать - ещё круче... :)