Ограничить длинну строки

Тема в разделе "WASM.BEGINNERS", создана пользователем ActioN, 22 янв 2006.

  1. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    Как можно сделать строку сиимволов нужной мне длинны? Знаю, что ответ где-то рядом, но я так и ненашел ответа через поиск.
     
  2. Topor

    Topor New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2005
    Сообщения:
    31
    Нулевой байт записать в конец.
     
  3. drmist

    drmist New Member

    Публикаций:
    0
    Регистрация:
    31 май 2005
    Сообщения:
    112
    ActioN

    .data

    db "abcde...сколько мне еще там нужно", 0



    или вы что-то другое имеете ввиду?
     
  4. Pretorian

    Pretorian New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    33
    Адрес:
    Russia
    вот такая структура в 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

    }
     
  5. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    Я имел ввиду я объявил строку, а точнее буффер так:

    .data

    buf db 256 dup(0)

    Потом где-то при надобности заношу какие-то символы в этот буффер. Их количество неизвестно, а мне надо, чтобы количество символов в буффере было например 8. Как такое сделать?

    В C++ Builder (Delphi) для этого служит 'string.SetLength(8)', а вот в масме как такое делается?

    Pretorian, жаль но мне нужно на MASM'e.

    P.S. sorry, что долго не писал, небыло инета:dntknw:.
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    > "мне надо, чтобы количество символов в буффере было например 8"

    Просто записываешь 0 по смещению 8
    Код (Text):
    1. mov byte ptr [buf+8],0
    2. или
    3. xor eax,eax
    4. mov [buf+8],al
     
  7. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    leo, спасибо большое, то что надо. А еще хотел спросить, какая разница между:

    buf db 128 dup(0)

    и

    buf db 128 dup(?)
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Формально dup(0) это инициализированная переменная, а dup(?) - не инициализированная.

    Но на самом деле винда при загрузке исполняемого файла всегда забивает все неинициализированные данные нулями. Поэтому в смысле инициализации разницы между dup(0) и dup(?) фактически нет.

    Но есть другая разница, которая может влиять на размер exe-файла. Если dup(?) объявлена в секции .data вместе с другими инициализированными переменными, то это вообще ничем не отличается от dup(0), т.к. в обоих случаях в exe будет записано соотв.число нулевых байт. А вот если объявить dup(?) в отдельной секции .data?, то можно сэкономить на размере exe-файла, т.к. данные из неинизиализированной секции .data? в exe-файл не записываются - тут все компиляторы просто указывают соответствующий виртуальный размер секции, а загрузчик сам выделяет требуемую память и заполняет ее нулями.

    PS: Только нужно иметь в виду, что суммарный размер данных в exe округляется вверх на границу 512 байт, поэтому если размер dup(?) мал и его добавление не увеличивает число 512-байтных секторов, то и уменьшения размера exe не будет