.data Y dd 0 и .data? Y dd ? В чем разница?Можно обьяснить на пальцах(плохо быть тупым-это я про себя).
.data это секция "инициализированных" данных (глобальных переменных), а .data? - "неинициализированных". Поскольку переменные могут инициализироваться не только нулями, но и произвольными числами и строками, то "инициализированные" данные сохраняются в exe-файле и увеличивают его размер. "Неинициализированные" данные в файле не сохраняются и винда при загрузке проги выделяет под них память, заполненную нулями. Поэтому для уменьшения размера экзешника данные, которые должны быть заполнены нулями, лучше объявлять в .data? (ес-но, если их достаточно много, т.к. из-за нескольких штук создавать доп.секцию не имеет смысла)
1) Повторяю 2) Поясняю. Размеры секций в исполняемых PE-файлах по умолчанию выравниваются на 512 байт (размер сектора HDD). Поэтому если у тебя небольшое число переменных и среди них есть ненулевые (например, строки сообщений и т.п.), то лучше все их объявлять в одной секции .data (т.к. иначе 512 байт в файле все равно "пропадут зря"). Если же все переменные = 0, или есть большие "неинициализированные" массивы, то их лучше задавать в секции .data?, т.к. она в файл не записывается вообще
leo Спасибо.С этим разобрался. А можно строки сообщений обьявлять в контантах? Например: .const Exit db "Exit",0
leo Не всегда, и зависит от компилятора и линкера Пара ml(6.14.8444) и link(5.12.8078) обрабатывая файлы, следующего содержания Код (Text): .686P .model flat .data dd 1000 dup (?) .code start: end start и Код (Text): .686P .model flat .data? dd 1000 dup (?) .code start: end start в командной строке Код (Text): \masm32\bin\ml /c /Cp /Gz /Ic:\masm32\include /coff /nologo %1.asm \masm32\bin\Link /SUBSYSTEM:WINDOWS /ALIGN:16 /MERGE:.data=.text /LIBPATH:c:\masm32\lib /NOLOGO %1.obj в обоих случаях создали файлы величиной 4464 байта. За то GoAsm(0.56.4) и GoLink(0.26.9а) в командной строке Код (Text): \GoAsm\bin\GoAsm %1 \GoAsm\bin\GoLink %1.obj kernel32.dll comdlg32.dll обработав файл Код (Text): .data a dd 1000 dup (?) создает exe величиной 512 байт, а файл Код (Text): .data a dd 1000 dup 0 exe величиной 4608 байт. fasm(1.67.26) в случае Код (Text): format PE GUI dd 1000 dup (?) создает exe в 512 байт, а в случае Код (Text): format PE GUI dd 1000 dup (0) создает exe в 4608 байт
leo Убрал, результат - тот же А вот теперь вернул /MERGE:.data=.text и убрал /ALIGN:16 - получил 4608 и 512 Стоит вернуть /ALIGN:512 и результат - оба файла по 4608 байт. Но не надеясь на компилятор, выделяю место под неинициализированные переменные вот так: Код (Text): sub esp, 600h ; резервирую память под буфер mov ebx, esp ; сохраняю указатель на буфер в регистре EBX ... ;что-то делаю с буфером add esp, 600h ; уничтожаю буфер нашел у мыщъа в "Ассемблер - экстремальная оптимизация"
Mikl__ Вот видишь: 1) все в твоих руках, 2) эксперименты с ALIGN в погоне за размером не всегда приводят к желаемому рез-ту Во-первых, каждый извращается на свой вкус и цвет Во-вторых, не стоит окончательно запутывать zxcc. Переменные типа dd (?) являются глобальными и только называются "неинициализированными", а на самом деле они заполнены нулями (при первом обращении ес-но). Локальные же переменные, выделяемые в стеке, практически всегда изначально содержат мусор, т.е. требуют программной инициализации (записи начального значения через mov или rep stos)
Помойму уже давно не встечал такой секции как bss и data? - их по дефолту вроде бы линкер мерджит с data, т.к. смысла в пустой секции нету