Строковые массивы на asm

Тема в разделе "WASM.BEGINNERS", создана пользователем 6eJIko, 29 фев 2008.

  1. 6eJIko

    6eJIko New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2007
    Сообщения:
    12
    Приветствую всех! =)

    Подскажите пожалуйста как сделать строковый массив на Асме и как обращаться к его эл-там.
    Спасибо! =)
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    6eJIko
    "Строковый массив" - это когда элементы массива строки?
     
  3. masm32

    masm32 New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2008
    Сообщения:
    147
    Может это массив строк? Смахивает на базу данных.
     
  4. axe_roma

    axe_roma New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2004
    Сообщения:
    93
    Адрес:
    Russia
    В ассемблере нет такого понятия массив это уже ты сам можешь написать кусок программы которая будет представлять данные массивом! т.е к примеру
    Код (Text):
    1.  mas db 'Kxe','kxe1','kxe2','Kxe','kxe1','kxe2',0
    просто строка длиная но можно представить как массив [2,3] это уже зависит от тебя.
     
  5. 6eJIko

    6eJIko New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2007
    Сообщения:
    12
    q_q
    угу))

    axe_roma
    Ну как бы если мы напишем:
    Код (Text):
    1. my     dd 100
    2.                   dd 200
    3.                   dd 300
    и если мы потом напишем [my+4], то получим число 200, т.к. размер DWORD 4...
    Если мы так напишем для mas, то мы не получем строку 'Kxe'.

    А я хочу как в Паскале например
    Код (Text):
    1. Type   TM = array [1..3] of String;
    2. Var     Ms:TM;
    3. .....
    4. BEGIN
    5.          .....
    6.          Ms[2]:= 'lalalalala';
    7.          WriteLn(Ms[2]);
    8.          .....
    9. END.
    Можно ли так в асме?
     
  6. axe_roma

    axe_roma New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2004
    Сообщения:
    93
    Адрес:
    Russia
    Конечно можно но походу придеться так как строки могут быть произвольно длины ну грубо. то
    создаем массив с адресами этих строк вот и все my dd адрес первой строки и т.д а потом просто выбираем адрес из массива и выводим строку)))
     
  7. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    6eJIko
    Можно, если учесть что длина string в Pascal'е=256
    На ассемблере это выглядит вот так:
    Код (Text):
    1. .const
    2. String equ 256
    3. .data
    4. TM db N dup (String dup (?));TM = array [1..N] of String
    5. string1 db 'lalalalala',0
    6. num = $ - string1; количество записываемых символов
    7. .code
    8. mov cx,num
    9. mov di,offset TM[String*(N-1)]
    10. ;в ассемблере нумерация идет с 0, а не с 1 как в паскале
    11. mov si,offset string1
    12. rep movsb;Ms[N]:= 'lalalalala'
     
  8. 6eJIko

    6eJIko New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2007
    Сообщения:
    12
    Спасибо Mikl__!

    axe_roma ты имеешь ввиду так:
    Код (Text):
    1. str1 db "hello",0
    2. str2 db "World",0
    3. str3 db "! =)",0
    4. ...
    5. my dd offset str1
    6.      dd offset str2
    7.      dd offset str3
    Да, я тоже об этом подумал =) Спасибо всем!!! ;)
     
  9. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Мне попадались следующие приемы:

    1. Строки записываются друг за другом, вместо 0 добавляется старший бит к последнему символу (предполагая, что строки содержит символы от 0 до 127). Когда нам надо получить i-й (i<>0) элемент, мы начинаем с начала, отсчитывая нужное количество байт с установленным старшим битом. После i-го найденного байта располагается искомый элемент массива строк. Так сделаны интерпретаторы BASIC первого поколения, для 8-битных процессоров. Достоинство - отсутствие знаков-терминаторов, и как следствие - экономия нескольких байт.

    Operators db "di","m"+80h,"fo","r"+80h,"nex","t"+80h,"prin","t"+80h

    2. Строки записываются со специальным терминатором (например, 0), после последнего элемента идет 2 терминатора друг за другом (признак конца массива). Это наиболее традиционный способ. Поиск i-го элемента примерно такой же, как в случае 1. - ищем нужное количество конечных символов.

    StringArray db "First",0,"Second",0,..."Next",0,..."Last",0,0

    Это для предопределенных массивов - когда все задано в исходнике, а не вводится откуда-то пользователем. Изменения или добавления элементов в такие структуры сущее мучение - надо переписывать и двигать все элементы от измененного/вставленного и до конца. Для десятка строк длиной в 10 байт максимум все просто. При работе с файлом, в котором тысячи строк, по несколько килобайт каждая - можно вешаться ;)

    3. Строки располагаются друг за другом, с терминатором, и параллельно создается массив указателей на них. 0-й элемент массива указателей содержит адрес первого свободного байта. частный случай списков. Можно добавлять новые элементы текста, добавляя одновременно новые указатели. Если происходит изменение содержимого одного из элементов, все, что имеет ту же длину или короче, записывается на старое место. Если длина больше, то записывается в конец, изменяя соответствующий указатель. При этом в массиве образуются "дыры" - обрывки предыдущих записей. Если строки не изменяются, и задаются в исходнике - тождественно приведенному варианту axe_roma. Вставка новых элементов проще простого - мы просто изменяем указатель в массиве указателей. И передвигаем все остальные. Массив слов (или двойных слов) передвинуть несколько проще, чем массив строк переменной длины. Для случая хранения таких структур в файле, используют 2 файла - собственно массив, и файл с индексами.

    4. Классические списки. массив состоит из структур <указатель на следующий элемент> <строка><терминатор>. если требуется что-то добавить, то просто заполняем строку, и устанавливаем указатель на следующий элемент (на свободное место). Отличается от (3) только тем, что указатели и строки образуют в памяти один сплошной массив. И работа с ним, соответственно, отличается от (3) - для доступа к i-му элементу надо прочитать указатель_0, по этому адресу указатель_1, ... и так далее до нужного. При изменении строк точно так же образуются "дыры". Терминатор необходим для случая редактирования одной из строк-элементов, с усечением - нам надо будет знать, где она кончится. Выглядит примерно так:

    start dd offset next1
    db "lalalalalala",0
    next1 dd offset next2
    db "bubububbu",0
    next2 ...

    Только как правило, предопределенных значений нет, все заполняется программно. Длина строки ограничена только размерами выделенной под такую структуру области. При вставке опять же, меняются только значения указателей. Допустим, я вставляю в приведенную выше структуру новый элемент на 1-е место (следующее за 0-м):

    start dd offset next10
    db "lalalalalala",0
    next1 dd offset next2
    db "bubububbu",0
    next2 ...
    ...
    next10 dd offset next1
    db "oe-oe-oe-oe!",0

    Больше ничего менять не нужно, ибо элементы связаны в цепочку. Нет необходимости перемещать в памяти строки или указатели при вставке/редактировании.

    Для случаев 3 и 4 также делаются специальные процедуры "сборки мусора" - дефрагментации. Кстати, файловая система - сделана примерно аналогичным образом. По крайней мере FAT.

    5. То, что предложено Mikl__. Размер строк жестко задан (не обязательно 256 байт - возможно, 128, или 512 - по вкусу и предназначению), строки большей длины при вводе обрезаются. К i-му элементу обращаемся очень просто - (адрес массива)+(размер строки по умолчанию)*i. Применительно к дискам - это работа с секторами или кластерами :)

    А вообще, мои дилетантские рассуждения ничто по сравнению с Дональдом Кнутом ;) Том 1, Информационные структуры. Списки, двусвязные списки, массивы, стеки, деки, деревья и прочее, о чем я даже не знаю и никогда не встречал на практике.
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    FatMoon
    забыл про паскалевские строки.