Вопрос по неинициализированным данным

Тема в разделе "WASM.BEGINNERS", создана пользователем integer, 10 авг 2008.

  1. integer

    integer New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2007
    Сообщения:
    62
    Код (Text):
    1. .data?
    2.     var db 64 dup(?)
    При выполнении программы переменная var будет заполнена нулями или случайными данными ?
     
  2. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    нулями
     
  3. integer

    integer New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2007
    Сообщения:
    62
    А что насчет локальных ?
    Код (Text):
    1. lala proc
    2.     LOCAL var [64]:BYTE
    3.     ret
    4. lala endp
     
  4. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    не факт. Я на практике сталкивался с ненулевыми значениями. В моем случае был объявлен сегмент обычного класса 'DATA', но он был объявлен так, что находился в конце карты сегментов (файл *.map) и не содержал ни одного инициализованного значения, в исполняемый файл включен не был. Вот он после запуска содежал ненулевые значения.
    Если я не ошибаюсь, секция .data? объявляет класс сегментов 'BSS'. При определенном порядке расположения сегментов, данные этой секции, вероятно, не будут включены в .ехе и, вероятно, не будут инициированы нулями.
     
  5. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    Локальные переменные объявляются в стеке при входе в процедуру путем вычитания из ESP нужного значения. Обнуления куска стека, отведенного под эти локальные переменные, так же не происходит.
     
  6. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    integer
    локальные переменные выделяются в стеке. Тут зависит все от того какую часть памяти выделит ОСь для стека вашей программы. Чаще не нули. Конечно можно установить адрес стека, скажем на неинициализированный массив. Тогда будут нули.

    Код (Text):
    1. .data
    2.     n_stack dd ?
    3. .code
    4. start:
    5.     mov [n_stack], esp ; сохраняем оригинальный адрес
    6.     mov esp, p_stack
    7.     ...
    8.     mov esp, [n_stack] ; восстанавливаем о. а.
    9.     xor eax, eax
    10.     ret
    11. ...
    12. .data?
    13.       v_stack  db  (1024*1024) dup(?) ; 1 мегабайт под стек
    14.       p_stack  dd  ?
     
  7. SloT

    SloT New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2008
    Сообщения:
    72
    по-моему для неинициализированных данных память не выделяется до восстребования.
     
  8. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Под стек память в любом случае выделена
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Barbos
    Будут, т.к. если размер секции в файле = 0, то винда сама под нее выделит память и заполнит нулями. Точнее сказать - винда всегда представляет процессу только обнуленные страницы физ.памяти и только потом, если страница проецируется на файл, то в нее пишутся данные из файла.
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    SloT
    Физическая память выделяется по требованию как для неинициализированных, так и для инициализированных данных и кода, т.к. рулит механизм обычного файл-маппинга - "не чеши пока не чешется" :)

    Arthur, 2FED
    Память под стек также выделяется по требованию (о сторожевой странице стека наверное слышали ;). Поэтому в сл.локальных переменных все зависит от того сколько памяти под стек уже было выделено и использовано до входа в функцию и сколько памяти выделяется под локальные переменные - если выделяется много и требуется выделение доп.страниц памяти, то эти доп.страницы будут обнуленными. Но в общем сл.на это расчитывать ес-но нельзя, если только для каких то "спецзадач"