Как можно сделать строку сиимволов нужной мне длинны? Знаю, что ответ где-то рядом, но я так и ненашел ответа через поиск.
вот такая структура в fasm struc string [str] { local label local label1 .len dd label1-label label: .string db str label1: } При создании строки: .data text1: string 'Привет!' fasm создаст строку и перед строкой укажет ее длину, так будет проще, если вспомним то функция апи WriteConsole именно просит длинну и указатель на строку, а 0 нам не нужен в конце. Значит: [text1.len] - длинна строки text1.string - указатель на строку Пример макроса: macro ConsolePrint i1,i2 ; Вывести текст на консоль ; Библиотека: kernel32 ; Вход: i1(dword)-адрес хранения handle, i2(str)-адрес строки { invoke WriteConsole,[i1],i2+4,[i2],i2,0 }
Я имел ввиду я объявил строку, а точнее буффер так: .data buf db 256 dup(0) Потом где-то при надобности заношу какие-то символы в этот буффер. Их количество неизвестно, а мне надо, чтобы количество символов в буффере было например 8. Как такое сделать? В C++ Builder (Delphi) для этого служит 'string.SetLength(8)', а вот в масме как такое делается? Pretorian, жаль но мне нужно на MASM'e. P.S. sorry, что долго не писал, небыло инета.
> "мне надо, чтобы количество символов в буффере было например 8" Просто записываешь 0 по смещению 8 Код (Text): mov byte ptr [buf+8],0 или xor eax,eax mov [buf+8],al
leo, спасибо большое, то что надо. А еще хотел спросить, какая разница между: buf db 128 dup(0) и buf db 128 dup(?)
Формально dup(0) это инициализированная переменная, а dup(?) - не инициализированная. Но на самом деле винда при загрузке исполняемого файла всегда забивает все неинициализированные данные нулями. Поэтому в смысле инициализации разницы между dup(0) и dup(?) фактически нет. Но есть другая разница, которая может влиять на размер exe-файла. Если dup(?) объявлена в секции .data вместе с другими инициализированными переменными, то это вообще ничем не отличается от dup(0), т.к. в обоих случаях в exe будет записано соотв.число нулевых байт. А вот если объявить dup(?) в отдельной секции .data?, то можно сэкономить на размере exe-файла, т.к. данные из неинизиализированной секции .data? в exe-файл не записываются - тут все компиляторы просто указывают соответствующий виртуальный размер секции, а загрузчик сам выделяет требуемую память и заполняет ее нулями. PS: Только нужно иметь в виду, что суммарный размер данных в exe округляется вверх на границу 512 байт, поэтому если размер dup(?) мал и его добавление не увеличивает число 512-байтных секторов, то и уменьшения размера exe не будет