Как занулить неинициализированные переменные секции .data?

Тема в разделе "WASM.BEGINNERS", создана пользователем core, 31 июл 2007.

  1. core

    core New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2007
    Сообщения:
    24
    Нужно повторно использовать ReadBufferX, если не очищать эту переменную, то произойдёт замена части строки, пример:
    читаем первый раз строку: это тест
    читаем второй раз строку: not
    вывод во второй раз: not тест, как сделать чтобы выводилось только not

    Написал небольшой(рабочий) примерчик демонстирующий проблему. Если использовать разные переменные, тобишь обходиться без макросов, то всё нормально, но для повышения стилистики и простоты кода, желательно было бы разобраться с данным вопросом.

    .486
    .model flat, stdcall
    option casemap: none

    include \masm32\include\windows.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib

    .data?
    hFileReadOpen HANDLE ?
    hCountReadByte DWORD ?
    ReadBufferX DWORD ?

    .code
    start:

    fileread macro name:req
    LOCAL xvalue

    .data
    xvalue db name, 0

    .code

    invoke CreateFile, addr xvalue, GENERIC_READ, FILE_SHARE_READ,\
    NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
    mov hFileReadOpen, eax

    invoke GetFileSize, hFileReadOpen, 0
    invoke ReadFile, hFileReadOpen, ADDR ReadBufferX, eax, ADDR hCountReadByte, NULL
    invoke CloseHandle, hFileReadOpen

    exitm <>

    endm

    fileread ("file1.txt")
    invoke MessageBox, NULL, ADDR ReadBufferX, NULL, MB_OK
    fileread ("file2.txt")
    invoke MessageBox, NULL, ADDR ReadBufferX, NULL, MB_OK
    fileread ("file3.txt")
    invoke MessageBox, NULL, ADDR ReadBufferX, NULL, MB_OK


    invoke ExitProcess, 0

    end start
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Ставь нулевой символ в конце строки. Ты же на асме пишешь - не думаю, что это вызовет затруднения.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    mov eax, [hCountReadByte]
    mov byte [ReadBufferX+eax], 0
     
  4. core

    core New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2007
    Сообщения:
    24
    Спасибо, попробую.
     
  5. core

    core New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2007
    Сообщения:
    24
    Это исправило проблему, ошибка первоначальной версии была незначительной. MSoft, Great, спасибо, проблема решена.
    .
    =) уже заметил, но дальше я попробую решить сам.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Это не исправило проблему, а лишь скрыло.
    Кстати, а где вообще место для буфера? Тут переполнением пахнет
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Great
    Угу, если файл больше 3х байт.
     
  8. core

    core New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2007
    Сообщения:
    24
    Это учебный пример, а не реальная программа, созданный с целью: решить проблему повторного использования переменной.

    Если можно поподробнее, мысли никогда не бывают лишними. Что вы советуете использовать как наилучший вариант решения? Цель - использование одной переменной для хранения читаемой информации, с последующим обнулением после извлечения результата.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Я бы даже в учебном примере написал ReadBufferX db 512 dup (?)
     
  10. core

    core New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2007
    Сообщения:
    24
    Во всём разобрался, спасибо за помощь.
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Great
    А я бы выделил память по размеру файла :) Правда, если он не превышает десятка мб.
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    IceStudent
    А я бы просто читал первые 511 байт (если файл текстовый) :-P

    Вообще зависит от задачи. Если файл можно обрабатывать блоками, тогда я в цикле читал бы по блоку, например по 4к (удобно - размер страницы как раз) и обрабатывал.
    А если файл надо весь целиком сразу иметь, тогда действительно проще под весь объем динамически буфер выделить
     
  13. Geen

    Geen New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2007
    Сообщения:
    51
    ребята ... это конечно здорово так использовать адресное пространство ... и действительно , будет работать ... пока используешь до конца отведенной странице под данные ... потом пройдет seh и система даст сему процессу еще страниц ... гм , а могет и не дать ... случалось уже.
    и задавать пустые блоки в памяти процесса - тоже левая идея ...
    проще систему попросить выделить свободный кусок памяти. и освобождать из контекста процесса при ее ненадобности ... скока хошь.
    вот ... работоспособный примерчик ... там про кучу.
     
  14. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Geen
    Ты про стек? Или о резервировании памяти с подкачкой? Но здесь речь шла о неинициализированной секции данных, под неё память выделяется сразу.

    Если они используются всё врёмя, то смысл выделять память отдельно. А на один раз действительно проще выделить.
     
  15. Geen

    Geen New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2007
    Сообщения:
    51
    причем тут стек ? ... мож конечно в стеке организовать локальный буфер ... но он тож будет висеть все время. не про это речь.
    еще имеет смысл , когда сразу не понять - скока выделять. зри примерчик ... рабочий вроде.
     
  16. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    А где ещё кроме стека используется подкачка, при которой
    ? Кроме ручной подкачки, о которой я упомянул.

    Как раз-таки не будет, т.к. стек по определению динамическая структура данных.
     
  17. core

    core New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2007
    Сообщения:
    24
    Выкладываю рабочий вариант с парой примеров, может кому пригодиться.
    Geen - освобождать сколько хочешь не всегда подходит под ситуацию.

    []
     
  18. Geen

    Geen New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2007
    Сообщения:
    51
    везде , где процессу не хватит памяти... он кстати этого и не заметит , как ему уже ее предоставят. и если как в первом случае , использовать только как ссылку на конец области данных (тока один дворд , типа), ему их выделят ... и так они процессу и останутся , покуда он не сгинет. и будут висеть вместе с ним... да долгую память подаренные. (пару гектар система подарить в состоянии ... расчитана на это) вот если дровина стукнет по несуществующей странице - bsod тут же.
    динамическая ? ... она процессу задается ... каждому - свой. и локальные буфера просто сидят выше базы стека. используется он или нет. если захочет стек побольше - то тот же вариант что и страницах с данными. их процесс не освобождает , раз поюзав.
    как ты думаешь , на кой системные сервисы после int 2eh выходя из контекста процесса перетаскивают данные из его стека в свой , не страничный (кроме графики , там особый случай). по приколу что ли ? ...
     
  19. Geen

    Geen New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2007
    Сообщения:
    51
    чет по примеру не понял необходимость ситуации... ну разве что маленькая програмка , почти не висящая долго в системе ... тогда это -
    фигня ... можно и гектар хапнуть.