Приветствую всех! =) Подскажите пожалуйста как сделать строковый массив на Асме и как обращаться к его эл-там. Спасибо! =)
В ассемблере нет такого понятия массив это уже ты сам можешь написать кусок программы которая будет представлять данные массивом! т.е к примеру Код (Text): mas db 'Kxe','kxe1','kxe2','Kxe','kxe1','kxe2',0 просто строка длиная но можно представить как массив [2,3] это уже зависит от тебя.
q_q угу)) axe_roma Ну как бы если мы напишем: Код (Text): my dd 100 dd 200 dd 300 и если мы потом напишем [my+4], то получим число 200, т.к. размер DWORD 4... Если мы так напишем для mas, то мы не получем строку 'Kxe'. А я хочу как в Паскале например Код (Text): Type TM = array [1..3] of String; Var Ms:TM; ..... BEGIN ..... Ms[2]:= 'lalalalala'; WriteLn(Ms[2]); ..... END. Можно ли так в асме?
Конечно можно но походу придеться так как строки могут быть произвольно длины ну грубо. то создаем массив с адресами этих строк вот и все my dd адрес первой строки и т.д а потом просто выбираем адрес из массива и выводим строку)))
6eJIko Можно, если учесть что длина string в Pascal'е=256 На ассемблере это выглядит вот так: Код (Text): .const String equ 256 .data TM db N dup (String dup (?));TM = array [1..N] of String string1 db 'lalalalala',0 num = $ - string1; количество записываемых символов .code mov cx,num mov di,offset TM[String*(N-1)] ;в ассемблере нумерация идет с 0, а не с 1 как в паскале mov si,offset string1 rep movsb;Ms[N]:= 'lalalalala'
Спасибо Mikl__! axe_roma ты имеешь ввиду так: Код (Text): str1 db "hello",0 str2 db "World",0 str3 db "! =)",0 ... my dd offset str1 dd offset str2 dd offset str3 Да, я тоже об этом подумал =) Спасибо всем!!!
Мне попадались следующие приемы: 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, Информационные структуры. Списки, двусвязные списки, массивы, стеки, деки, деревья и прочее, о чем я даже не знаю и никогда не встречал на практике.