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

Discussion in 'WASM.BEGINNERS' started by integer, Aug 10, 2008.

  1. integer

    integer New Member

    Blog Posts:
    0
    Joined:
    Jan 2, 2007
    Messages:
    62
    Code (Text):
    1. .data?
    2.     var db 64 dup(?)
    При выполнении программы переменная var будет заполнена нулями или случайными данными ?
     
  2. 2FED

    2FED New Member

    Blog Posts:
    0
    Joined:
    Feb 20, 2008
    Messages:
    1,002
    нулями
     
  3. integer

    integer New Member

    Blog Posts:
    0
    Joined:
    Jan 2, 2007
    Messages:
    62
    А что насчет локальных ?
    Code (Text):
    1. lala proc
    2.     LOCAL var [64]:BYTE
    3.     ret
    4. lala endp
     
  4. Barbos

    Barbos Slavon

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

    Barbos Slavon

    Blog Posts:
    0
    Joined:
    Nov 13, 2007
    Messages:
    280
    Location:
    Kharkov
    Локальные переменные объявляются в стеке при входе в процедуру путем вычитания из ESP нужного значения. Обнуления куска стека, отведенного под эти локальные переменные, так же не происходит.
     
  6. Arthur

    Arthur New Member

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

    Code (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

    Blog Posts:
    0
    Joined:
    Aug 11, 2008
    Messages:
    72
    по-моему для неинициализированных данных память не выделяется до восстребования.
     
  8. 2FED

    2FED New Member

    Blog Posts:
    0
    Joined:
    Feb 20, 2008
    Messages:
    1,002
    Под стек память в любом случае выделена
     
  9. leo

    leo Active Member

    Blog Posts:
    0
    Joined:
    Aug 4, 2004
    Messages:
    2,542
    Location:
    Russia
    Barbos
    Будут, т.к. если размер секции в файле = 0, то винда сама под нее выделит память и заполнит нулями. Точнее сказать - винда всегда представляет процессу только обнуленные страницы физ.памяти и только потом, если страница проецируется на файл, то в нее пишутся данные из файла.
     
  10. leo

    leo Active Member

    Blog Posts:
    0
    Joined:
    Aug 4, 2004
    Messages:
    2,542
    Location:
    Russia
    SloT
    Физическая память выделяется по требованию как для неинициализированных, так и для инициализированных данных и кода, т.к. рулит механизм обычного файл-маппинга - "не чеши пока не чешется" :)

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