Односвязной список на фасме ... помогите реализовать

Связь ассемблера с другими языками программирования

Односвязной список на фасме ... помогите реализовать

Сообщение plan4ik » Вт апр 26, 2011 8:36 am

Решил написать связной список с помощью структур и указателей на динамически распределяемую память. Все продумал ну или почти все, ну вообщем главную процедуру 8-) все должно работать .... ну а там когда вышеописаная заработает допишу остальное. :P Но как только начал реализовывать сразу начал спотыкатся об структуры :cry:

Код: Выделить всё
Определить тип структуры :
   +0) Tag(BYTE) — обозначающий тип объекта (только для пользователя)
   +1) Object(WORD) --Адресс выделеной памяти
   +3) Size(WORD) -- Размер объекта в байтах
   +5) Next(WORD) -- адрес следующего узла

   Итого (7 байт - 1 параграф)

Коды ошибок:
     SL_SUCCESS      equ   0
     SL_NO_MEM      equ   1
     SL_ZERO_SIZE   equ   2


-----------[подготовить новый лист]------------------------[Init List]------
для постройки листа нужен указатель типа WORD адреса головы листа и нужно
обнулить его для первого вхождения

А вот нижеописана процедура и есть главная и от нее зависет код остальных процедур  :arrow:

--------[создание размещение и инициализация узла]--------------------[SLAdd]----
Определить процедуру SLAdd: подготавливает первый\следующий узел с помощью полученой информации
   
   proc SLAdd, List_addr:WORD, Tag_value:BYTE, Size_val:WORD, \
            Object_seg_addr:WORD, Object_offset_addr:WORD

Алгоритм:

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

   [head_addr (Object) ]-->[next_addr (Object) ]--> ... -->[0 (Object)]

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 0) проверить размер объекта если он равен нулю
   0.1) вернуть код ошибки DX:ZERO_SIZE

 1) Выделить память самой структуры, (+проверка)
   1.1) Выделением памяти должна заниматся отдельная процедура
      proc malloc, Size_val:WORD
   1.2) в случае ошибки вернуть код ошибки: DX:SL_NO_MEM

 2) Выделить память для объекта (+проверка)
   2.1) Выделением памяти должна заниматся отдельная процедура
      proc malloc, Size_val:WORD
   2.2) в случае ошибки вернуть код ошибки: DX:SL_NO_MEM
        2.3) в случае ошибки освободить память для структуры


 3) Заполнить поля структуры кроме адреса следующего узла
   3.1) Поле объекта нужно скопировать с передачой размера
      proc memcpy, from_base_addr:WORD, from_offset_addr:WORD, \
            to_addr:WORD, Size_val:WORD
   3.2) Заполнить поле Tag
   3.3) Заполнить поле Size
 
 4) упорядочить связной список:
   4.1) эсли адрес первого элемента равен нулю
      4.1.1) присвоить головному адресу адрес нового узла
      4.1.2) обнулить в новом узле адрес следующего узла
   4.2) иначе, выставить новый узел сразу после первого
      4.2.1) присвоить новому узлу адрес второго узла
      4.2.2) присвоить головному узлу адрес нового узла


Пожалуйста, помогите достаточно будет просто показать пример использования структуры для конкретно этога случая ...
Примерно так это должно выглядеть на СИ:
Код: Выделить всё
#define SL_SUCCESS         0
#define SL_NO_MEM         1
#define SL_ZERO_SIZE      2

#define BYTE unsigned char

typedef struct SLLIST
{
   BYTE           Tag;
   void           *Object;
   size_t   Size;
   struct   SLLIST *Next;
} SLLIST;

BYTE SLAdd(SLLIST   **List,
         BYTE      Tag,
         void   *Object,
         size_t   Size)
{
   assert(List);
   BYTE   Result = SL_SUCCESS;
   SLLIST   *NewItem;

   if(Size > 0)
   {
      if((NewItem = (SLLIST *) malloc(sizeof *NewItem)) )
      {
         if((NewItem->Object = (void *) malloc(Size)) )
         {
            NewItem->Tag   = Tag;
            memcpy(NewItem->Object, Object, Size);
            NewItem->Size   = Size;
            
            if(*List)
            {
               NewItem->Next = (*List)->Next;
               (*List)->Next = NewItem;
            }
            else
            {
               NewItem->Next = NULL;
               *List = NewItem;
            }
         }
         else
         {
            Result = SL_NO_MEM;
            free(NewItem);
         }
      }
      else
         Result = SL_NO_MEM;
   }
   else
      Result = SL_ZERO_SIZE;

   return Result;
}
Чем больше я узнаю, тем больше я узнаю на сколько мало я знаю - Сократ.
Аватара пользователя
plan4ik
участник
 
Сообщения: 31
Зарегистрирован: Ср мар 30, 2011 12:17 pm

Re: Односвязной список на фасме ... помогите реализовать

Сообщение plan4ik » Вт апр 26, 2011 8:54 am

Я могу это сделать и так, выделить память в 1 параграф (16 байт)
+0 байт параграфа == Tag (1 байт)
+1 байт параграфа == адрес Object'a (2 байта)
+3 байт параграфа == Size (2 байта)
+5 байт параграфа == Next -- адрес следубщего узла или 0 если он последний (2 байта)
+7 байт параграфа == не используются

и пригать по нему как козел :mrgreen: заполняя вручную поля, но я хочу спомощью структур -- по человечиски ;) И как структуре присвоить\заполнить свежеиспеченную память ??? на случай если мой объект окажется структурой и не только ....
Чем больше я узнаю, тем больше я узнаю на сколько мало я знаю - Сократ.
Аватара пользователя
plan4ik
участник
 
Сообщения: 31
Зарегистрирован: Ср мар 30, 2011 12:17 pm


Вернуться в Ассемблер и языки высокого уровня

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron