локальные и глобальные переменные

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

  1. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Можно, только это уже не локальная переменная.
     
  2. zxcc

    zxcc New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2006
    Сообщения:
    172
    .data
    Y dd 0
    и
    .data?
    Y dd ?
    В чем разница?Можно обьяснить на пальцах(плохо быть тупым-это я про себя).
     
  3. leo

    leo Active Member

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

    zxcc New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2006
    Сообщения:
    172
    Т.е. в данном случае лучше так
    .data?
    Y dd ?
    чем
    .data
    Y dd 0
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    1) Повторяю
    2) Поясняю. Размеры секций в исполняемых PE-файлах по умолчанию выравниваются на 512 байт (размер сектора HDD). Поэтому если у тебя небольшое число переменных и среди них есть ненулевые (например, строки сообщений и т.п.), то лучше все их объявлять в одной секции .data (т.к. иначе 512 байт в файле все равно "пропадут зря"). Если же все переменные = 0, или есть большие "неинициализированные" массивы, то их лучше задавать в секции .data?, т.к. она в файл не записывается вообще
     
  6. zxcc

    zxcc New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2006
    Сообщения:
    172
    leo Спасибо.С этим разобрался.
    А можно строки сообщений обьявлять в контантах?
    Например:
    .const
    Exit db "Exit",0
     
  7. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    leo
    Не всегда, и зависит от компилятора и линкера
    Пара ml(6.14.8444) и link(5.12.8078) обрабатывая файлы, следующего содержания
    Код (Text):
    1. .686P
    2. .model flat
    3. .data
    4. dd 1000  dup (?)
    5. .code
    6. start:
    7. end start
    и
    Код (Text):
    1. .686P
    2. .model flat
    3. .data?
    4. dd 1000  dup (?)
    5. .code
    6. start:
    7. end start
    в командной строке
    Код (Text):
    1. \masm32\bin\ml /c /Cp /Gz /Ic:\masm32\include /coff /nologo %1.asm
    2. \masm32\bin\Link   /SUBSYSTEM:WINDOWS  /ALIGN:16  /MERGE:.data=.text
    3.  /LIBPATH:c:\masm32\lib /NOLOGO %1.obj
    в обоих случаях создали файлы величиной 4464 байта. За то GoAsm(0.56.4) и GoLink(0.26.9а) в командной строке
    Код (Text):
    1. \GoAsm\bin\GoAsm %1
    2. \GoAsm\bin\GoLink %1.obj kernel32.dll comdlg32.dll
    обработав файл
    Код (Text):
    1. .data
    2. a dd 1000  dup (?)
    создает exe величиной 512 байт, а файл
    Код (Text):
    1. .data
    2. a dd 1000  dup 0
    exe величиной 4608 байт. fasm(1.67.26) в случае
    Код (Text):
    1. format PE GUI
    2. dd 1000 dup (?)
    создает exe в 512 байт, а в случае
    Код (Text):
    1. format PE GUI
    2. dd 1000 dup (0)
    создает exe в 4608 байт
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    ... и программера. Убери /MERGE:.data=.text и почувствуй разницу ;)
     
  9. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    leo
    Убрал, результат - тот же:dntknw: А вот теперь вернул /MERGE:.data=.text и убрал /ALIGN:16 - получил 4608 и 512 :) Стоит вернуть /ALIGN:512 и результат - оба файла по 4608 байт. Но не надеясь на компилятор, выделяю место под неинициализированные переменные вот так:
    Код (Text):
    1. sub esp, 600h          ; резервирую память под буфер
    2.         mov ebx, esp            ; сохраняю указатель на буфер в регистре EBX
    3.             ...               ;что-то делаю с буфером
    4.        add esp, 600h    ; уничтожаю буфер
    нашел у мыщъа в "Ассемблер - экстремальная оптимизация"
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Mikl__
    Вот видишь: 1) все в твоих руках, 2) эксперименты с ALIGN в погоне за размером не всегда приводят к желаемому рез-ту

    Во-первых, каждый извращается на свой вкус и цвет ;)
    Во-вторых, не стоит окончательно запутывать zxcc. Переменные типа dd (?) являются глобальными и только называются "неинициализированными", а на самом деле они заполнены нулями (при первом обращении ес-но). Локальные же переменные, выделяемые в стеке, практически всегда изначально содержат мусор, т.е. требуют программной инициализации (записи начального значения через mov или rep stos)
     
  11. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Помойму уже давно не встечал такой секции как bss и data? - их по дефолту вроде бы линкер мерджит с data, т.к. смысла в пустой секции нету